ByteBuf.arrayOffset无用吗?

3

我正在学习 Netty实战

在第5.2.2节 ByteBuf使用模式中,有一段代码让我感到困惑。如下所示。

ByteBuf heapBuf = ...
if (heapBuf.hasArray()) {
    byte[] array = heapBuf.array();
    int offset = heapBuf.arrayOffset() + heapBuf.readerIndex();
    int lenght = heapBuf.readableBytes();
    handleArray(array, offset, length)
}

我想知道ByteBuf.arrayOffset()方法的用途。该方法的文档如下:

返回此缓冲区的支撑字节数组中第一个字节的偏移量。

然后,我查看了实现ByteBufUnpooledHeapByteBuf.java中的arrayOffset()方法。如下所示,该方法的实现始终返回0
@Override
public int arrayOffset() {
    return 0;
}

所以,ByteBuf#arrayOffset 是无用的吗?

1
这是一个类的方法实现。 - user2357112
2
@user2357112 想要表达的是,ByteBuf 可能有其他实现方式,而且可能存在更加有用或者复杂的实现方式。所以对于 UnpooledHeapByteBuf 返回 0 是这种实现方式的结果,但这并不意味着没有其他的 ByteBuf 实现方式。该方法应该按照文档说明执行,你可以想象其他实现方式确实具有与 0 不同的真正偏移量。 - Zabuzard
数组偏移何时会改变?为什么要改变偏移量? - wujunbin
2个回答

1

可能有其他ByteBuf的实现方式,它们可能有更加有用甚至是复杂的实现方式。

所以对于UnpooledHeapByteBuf的情况,返回0是可行的,但这并不意味着没有其他ByteBuf的实现需要不同的实现方式。


该方法应该按照文档所述执行,你可以想象其他实现确实有一个与0不同的偏移量。例如,如果它们使用类似于循环数组的东西作为后备字节数组。
在这种情况下,该方法需要返回当前起始指针所在位置的索引,而不是0
以下是显示这样的循环数组的示例图像(当前指针位于索引2而不是0,在使用它时它会在数组中移动):

circular-array example


在用户侧,如果你想安全使用你的ByteBuf对象,你也应该使用该方法。如果你操作的是UnpooledHeapByteBuf,那么可以避免使用它,但即使如此,也不应该这样做,因为可能会在未来版本中更改内部行为。


1
非常感谢您的帮助。 - wujunbin

0

这并不是无用的,因为它允许我们将一个巨大的字节数组返回多个ByteBuf实现。事实上,PooledHeapByteBuf就是这样做的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接