如何避免关于原始类型的代码重复?

Dav*_*vis 9 java arrays code-duplication

背景

位输入流由字节数组支持。有一些方法可以从该字节数组读取到各种强制原始数组。

问题

有重复的代码。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;
}
Run Code Online (Sandbox Code Playgroud)

注意如何final byte[] out涉及到readByte(bits)同样final short[] out涉及readShort(bits)。这些关系是问题的症结所在。

如何消除重复,如果有的话,又不会导致显着的性能损失(例如,通过自动装箱)?

有关的

mar*_*ace 2

如果您正在阅读像代码所示的批量原语,那么使用asDoubleBuffer()asShortBuffer()等ByteBuffer方法将减轻一些最低级别的工作。

例子:

   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`
   }
Run Code Online (Sandbox Code Playgroud)

(代码可以编译但未经测试!)