Latar Belakang
Input stream bit didukung oleh array byte. Ada beberapa metode yang membaca dari array byte itu ke berbagai array primitif yang dipaksakan.
Masalah
Ada kode duplikat. Java tidak memiliki generik pada tipe primitif, jadi mungkin pengulangan tidak dapat dihindari.
Kode
Kode berulang terlihat dalam metode berikut:
@Override
public long readBytes(final byte[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readByte(bits);
}
return position() - startPosition;
}
@Override
public long readShorts(final short[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readShort(bits);
}
return position() - startPosition;
}
Perhatikan bagaimana final byte[] out
berhubungan dengan readByte(bits)
seperti final short[] out
berkaitan dengan readShort(bits)
. Hubungan-hubungan ini adalah inti masalahnya.
Pertanyaan
Bagaimana duplikasi dapat dihilangkan, jika sama sekali, tanpa menimbulkan hit kinerja yang signifikan (misalnya, dengan autoboxing)?
Terkait
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Ya. (Biasanya itu tidak banyak masalah, karena jarang satu program membutuhkan lebih dari beberapa primitif yang berbeda. Anda juga bisa "memperbaiki" ini dengan meletakkan primitif di dalam kelas dan menggunakan serialisasi objek, meskipun itu bisa relatif lambat. )
ByteBuffer
metode seperti asDoubleBuffer()
atau asShortBuffer()
akan membongkar beberapa pekerjaan tingkat terendah. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
List<int>
dll. Rilis dalam mungkin 2-5 tahun atau lebih. Ini disebut Project Valhalla.