Arka fon
Bir bit giriş akışı bir bayt dizisiyle desteklenir. Bu bayt dizisinden çeşitli zorlanmış ilkel dizilere okunan birkaç yöntem vardır.
Sorun
Yinelenen kod var. Java, ilkel türlerde jeneriklerden yoksundur, bu nedenle tekrarlama kaçınılmazdır.
kod
Yinelenen kod aşağıdaki yöntemlerde belirgindir:
@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;
}
Not nasıl final byte[] out
ilgilidir readByte(bits)
tıpkı final short[] out
ilgilidir readShort(bits)
. Bu ilişkiler sorunun temelini oluşturur.
Soru
Önemli bir performans isabetine girmeden (örneğin, otomatik boks ile), çoğalma, hiç nasıl ortadan kaldırılabilir?
İlişkili
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Evet. (Genellikle bir sorun değildir, çünkü bir programın birkaç farklı ilkelden daha fazlasına ihtiyaç duyması nadirdir. Ayrıca, bir sınıfın içine ilkel koyarak ve nesne serileştirmesi kullanarak bunu "düzeltebilirsiniz", ancak bu nispeten yavaş olabilir. )
ByteBuffer
gibi asDoubleBuffer()
veya bunları asShortBuffer()
kullanacak yöntemleri kullanmak gibi görünüyor . docs.oracle.com/tr/java/javase/11/docs/api/java.base/java/nio/…
List<int>
vb. İlkel jenerik destek getirmek için bazı çabalar olduğunu unutmayın . Belki 2-5 yıl içinde serbest bırakın. Buna Project Valhalla denir.