Одна возможность, которая повлечет за собой снижение производительности, заключается в использовании java.lang.reflect.Array
для обработки массива как объекта, который затем позволяет повторно использовать один и тот же код во всех методах чтения.
@FunctionalInterface
public interface BitArrayReader {
Object read(int bits);
}
private long readPrimitive(
final Object out, final int offset, final int count, final int bits,
final BitArrayReader reader) {
final int total = offset + count;
assert out != null;
assert total <= Array.getLength(out);
final long startPosition = position();
for (int i = offset; i < total; i++) {
Array.set(out, i, reader.read(bits));
}
return position() - startPosition;
}
@Override
public long readBooleans(boolean[] out, int offset, int count, int bits) {
return readPrimitive(out, offset, count, bits, this::readBoolean);
}
Дублирование было решено за счет некоторой производительности, незначительного отсутствия безопасности типа во время компиляции и использования отражения.