Фон
Поточний вхідний біт підтримується масивом байтів. Існує кілька методів, які читають з цього байтового масиву різні примусові примітивні масиви.
Проблема
Існує дубльований код. У 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.