tło
Bitowy strumień wejściowy jest wspierany przez tablicę bajtów. Istnieje kilka metod, które odczytują z tej tablicy bajtów na różne wymuszone pierwotne tablice.
Problem
Istnieje zduplikowany kod. W Javie brakuje generycznych typów pierwotnych, więc być może powtórzenie jest nieuniknione.
Kod
Powtarzalny kod jest widoczny w następujących metodach:
@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;
}
Zwróć uwagę, jak final byte[] out
odnosi się do readByte(bits)
tak, jak final short[] out
odnosi się do readShort(bits)
. Relacje te stanowią sedno problemu.
Pytanie
Jak można wyeliminować duplikację, jeśli w ogóle, bez znacznego spadku wydajności (np. Przez autoboxing)?
Związane z
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Tak. (Zwykle nie stanowi to większego problemu, ponieważ jeden program potrzebuje więcej niż kilku różnych prymitywów. Można to również „naprawić”, umieszczając prymitywy w klasie i stosując serializację obiektów, chociaż może to być stosunkowo wolne. )
ByteBuffer
metod takich jak asDoubleBuffer()
lub asShortBuffer()
spowoduje odciążenie części pracy na najniższym poziomie. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/…
List<int>
. Wydanie może za około 2-5 lat. Nazywa się Project Valhalla.