sfondo
Un flusso di input bit è supportato da una matrice di byte. Esistono una manciata di metodi che leggono da quell'array di byte in vari array primitivi forzati.
Problema
C'è un codice duplicato. Java non ha generici sui tipi primitivi, quindi forse la ripetizione è inevitabile.
Codice
Il codice ripetitivo è evidente nei seguenti metodi:
@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;
}
Nota come si final byte[] out
riferisce a readByte(bits)
come si final short[] out
riferisce a readShort(bits)
. Queste relazioni sono il nocciolo del problema.
Domanda
Come è possibile eliminare la duplicazione, se non del tutto, senza incorrere in un significativo calo delle prestazioni (ad esempio, con l'autoboxing)?
Relazionato
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Sì. (Di solito non è un problema, dato che è raro che un programma abbia bisogno di più di alcune primitive diverse. Si potrebbe anche "risolvere" inserendo le primitive all'interno di una classe e usando la serializzazione degli oggetti, sebbene ciò possa essere relativamente lento. )
ByteBuffer
metodi come asDoubleBuffer()
o asShortBuffer()
scaricherà alcuni dei lavori di livello più basso. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
List<int>
ecc. Rilascio in circa 2-5 anni circa. Si chiama Project Valhalla.