【发布时间】:2020-02-27 19:15:57
【问题描述】:
背景
位输入流由字节数组支持。有一些方法可以从该字节数组中读取到各种强制原始数组中。
问题
有重复的代码。 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/en/java/javase/11/docs/api/java.base/java/nio/… -
请注意,有一些努力为 Java 带来原始的泛型支持,即
List<int>等。可能在 2-5 年左右发布。它被称为瓦尔哈拉计划。
标签: java arrays code-duplication