Фон
Входной поток битов поддерживается массивом байтов. Есть несколько методов, которые читают из этого байтового массива в различные принудительные примитивные массивы.
проблема
Есть дублированный код. В Java нет обобщений на примитивных типах, поэтому, возможно, повторение неизбежно.
Код
Повторяющийся код проявляется в следующих методах:
@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;
}
Обратите внимание, как final byte[] out
относится к так readByte(bits)
же, как final short[] out
относится к readShort(bits)
. Эти отношения - суть проблемы.
Вопрос
Как можно устранить дублирование, если оно вообще не произошло, без значительного снижения производительности (например, с помощью автобокса)?
связанные с
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Ага. (Обычно это не большая проблема, поскольку одной программе редко требуется больше, чем несколько разных примитивов. Вы также можете «исправить» это, поместив примитивы в класс и используя сериализацию объектов, хотя это может быть относительно медленным. )
ByteBuffer
таких методов, как asDoubleBuffer()
или asShortBuffer()
будет снимать часть работы самого низкого уровня. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
List<int>
т. Е. И т. Д. Выпуск может быть через 2-5 лет или около того. Это называется Project Valhalla.