พื้นหลัง
กระแสข้อมูลบิตได้รับการสนับสนุนโดยอาร์เรย์ของไบต์ มีวิธีการจำนวนหนึ่งที่อ่านจากอาร์เรย์ไบต์นั้นไปยังอาร์เรย์ดั้งเดิมแบบบังคับ
ปัญหา
มีรหัสซ้ำอยู่ 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/th/java/javase/11/docs/api/java.base/java/nio/ ......
List<int>
ฯลฯ วางจำหน่ายในอีก 2-5 ปีหรือมากกว่านั้น มันเรียกว่า Project Valhalla