Contexte
Un flux d'entrée de bits est soutenu par un tableau d'octets. Il existe une poignée de méthodes qui lisent ce tableau d'octets dans divers tableaux primitifs sous contrainte.
Problème
Il y a du code en double. Java manque de génériques sur les types primitifs, donc la répétition est peut-être inévitable.
Code
Le code répétitif est apparent dans les méthodes suivantes:
@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;
}
Notez comment se final byte[] out
rapporte à readByte(bits)
tout comme se final short[] out
rapporte à readShort(bits)
. Ces relations sont au cœur du problème.
Question
Comment la duplication peut-elle être éliminée, le cas échéant, sans encourir un impact significatif sur les performances (par exemple, par autoboxing)?
en relation
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Ouaip. (Habituellement, ce n'est pas vraiment un problème, car il est rare qu'un programme ait besoin de plusieurs primitives différentes. Vous pouvez également "corriger" cela en plaçant des primitives dans une classe et en utilisant la sérialisation d'objets, bien que cela puisse être relativement lent. )
ByteBuffer
méthodes comme asDoubleBuffer()
ou asShortBuffer()
déchargera certains des travaux de niveau le plus bas. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
List<int>
etc. Sortie dans environ 2 à 5 ans. Il s'agit du projet Valhalla.