背景
位输入流由字节数组支持。有几种方法可以从该字节数组中读取各种强制的原始数组。
问题
有重复的代码。 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)
的关系一样。这些关系是问题的症结所在。问题
如何消除重复(如果有的话)而又不会造成明显的性能损失(例如,通过自动装箱)?
有关的
最佳答案
如果您正在阅读大量的原语,如您的代码似乎表明的那样,那么使用ByteBuffer或asDoubleBuffer()之类的asShortBuffer()方法将减轻一些最低级别的工作。
例子:
public void readBytes( final byte[] out, final int offset, final int count, final ByteBuffer buffer ) {
buffer.get( out, offset, count ); // udates ByteBuffer `position` automatically
}
public void readShorts( final short[] out, final int offset, final int count, final ByteBuffer buffer ) {
ShortBuffer sb = buffer.asShortBuffer();
sb.get( out, offset, count ); // note that `count` reads two bytes for each `short`
}
(代码可以编译,但未经测试!)
关于java - 如何避免有关原始类型的代码重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60440278/