Hintergrund
Ein Bit-Eingabestream wird durch ein Array von Bytes unterstützt. Es gibt eine Handvoll Methoden, die von diesem Byte-Array in verschiedene erzwungene primitive Arrays lesen.
Problem
Es gibt doppelten Code. In Java fehlen Generika für primitive Typen, daher ist die Wiederholung möglicherweise unvermeidbar.
Code
Der sich wiederholende Code wird bei den folgenden Methoden deutlich:
@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;
}
Beachten Sie, wie final byte[] out
sich auf readByte(bits)
genau wie final short[] out
bezieht readShort(bits)
. Diese Beziehungen sind der Kern des Problems.
Frage
Wie kann die Duplizierung, wenn überhaupt, beseitigt werden, ohne dass ein erheblicher Leistungseinbruch auftritt (z. B. durch Autoboxing)?
verbunden
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Jep. (Normalerweise ist dies kein großes Problem, da ein Programm selten mehr als ein paar verschiedene Grundelemente benötigt. Sie können dies auch "beheben", indem Sie Grundelemente in eine Klasse einfügen und die Objekt-Serialisierung verwenden, obwohl dies relativ langsam sein kann. )
ByteBuffer
Methoden wie asDoubleBuffer()
oder asShortBuffer()
werden einige der Arbeiten der untersten Ebene auslagern. docs.oracle.com/de/java/javase/11/docs/api/java.base/java/nio/…
List<int>
Veröffentlichung in etwa 2-5 Jahren. Es heißt Projekt Valhalla.