Lý lịch
Một luồng đầu vào bit được hỗ trợ bởi một mảng byte. Có một số phương thức đọc từ mảng byte đó thành các mảng nguyên thủy bị ép buộc khác nhau.
Vấn đề
Có mã trùng lặp. Java thiếu khái quát về các kiểu nguyên thủy, vì vậy có lẽ việc lặp lại là không thể tránh khỏi.
Mã
Mã lặp đi lặp lại là rõ ràng trong các phương pháp sau:
@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;
}
Lưu ý làm thế nào final byte[] out
liên quan đến readByte(bits)
chỉ là final short[] out
liên quan đến readShort(bits)
. Những mối quan hệ này là mấu chốt của vấn đề.
Câu hỏi
Làm thế nào để sao chép có thể được loại bỏ, nếu hoàn toàn không gây ra một cú đánh hiệu suất đáng kể (ví dụ: bằng cách tự động đóng hộp)?
Liên quan
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
Vâng . )
ByteBuffer
các phương thức như asDoubleBuffer()
hoặc asShortBuffer()
sẽ giảm tải một số công việc ở mức thấp nhất. docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/ Kẻ
List<int>
v.v. Phát hành trong khoảng 2 - 5 năm hoặc lâu hơn. Nó được gọi là Dự án Valhalla.