java - 如何避免有关原始类型的代码重复?

标签 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;
}

请注意 final byte[] out 的关系readByte(bits) 的关系,就像 final short[] out readShort(bits) 的关系一样。这些关系是问题的症结所在。

问题

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

有关的
  • https://stackoverflow.com/a/9666217/59087
  • https://stackoverflow.com/a/27716039/59087
  • https://wiki.openjdk.java.net/display/valhalla/Main
  • https://www.slideshare.net/IvanIvanov138/primitives-in-generics-from-project-valhala
  • 最佳答案

    如果您正在阅读大量的原语,如您的代码似乎表明的那样,那么使用ByteBufferasDoubleBuffer()之类的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/

    相关文章:

    c++ - 有没有办法在提供左值和右值重载的同时删除重复代码?

    java - 替代反射以生成随机子类的对象

    java - Java Web 应用程序的任务模式

    Java方法调用

    java - 在java中使用多线程添加整数2D数组元素比顺序添加慢

    c - 数组访问 args[0][1] -'0'

    jsf - 如何使用 JSF 和 JPA 避免模型代码重复

    java - 如何使用列表 <?扩展 Map<String, ?>>

    java - 在java中可逆地改组一个int数组

    ruby-on-rails - Rails - 相同表单的不同 form_for 语句