fundo
Um fluxo de entrada de bits é apoiado por uma matriz de bytes. Existem vários métodos que lêem essa matriz de bytes em várias matrizes primitivas coagidas.
Problema
Existe um código duplicado. Java não possui genéricos em tipos primitivos, portanto, talvez a repetição seja inevitável.
Código
O código repetitivo é aparente nos seguintes métodos:
@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;
}
Observe como final byte[] out
se relaciona readByte(bits)
exatamente como final short[] out
se relaciona readShort(bits)
. Essas relações são o cerne do problema.
Questão
Como a duplicação pode ser eliminada, se é que existe, sem incorrer em um impacto significativo no desempenho (por exemplo, por autoboxing)?
Relacionado
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Sim. (Geralmente, não é um problema, pois é raro um programa precisar de mais do que algumas primitivas diferentes. Você também pode "consertar" isso colocando as primitivas em uma classe e usando a serialização de objetos, embora isso possa ser relativamente lento. )
ByteBuffer
métodos como asDoubleBuffer()
ou asShortBuffer()
descarregará parte do trabalho de nível mais baixo. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
List<int>
etc. Liberte em talvez 2-5 anos ou mais. É chamado Projeto Valhalla.