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[] outberhubungan dengan readByte(bits)seperti final short[] outberkaitan 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. )
ByteBuffermetode 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.