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[] outilgilidir readByte(bits)tıpkı final short[] outilgilidir 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. )
ByteBuffergibi 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.