ByteBuf.arrayOffset没用吗?

Is ByteBuf.arrayOffset useless?

我正在学习 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() 方法的用例是什么。该方法的文档如下:

Returns the offset of the first byte within the backing byte array of this buffer.

然后,我在UnpooledHeapByteBuf.java中查找了实现ByteBufarrayOffset()方法。 always 方法的实现只是 returns 0,如下所示。

@Override
public int arrayOffset() {
    return 0;
}

所以,ByteBuf#arrayOffset没用吗?

可能还有 ByteBuf 的其他实现,它们可能有更多 有用的 甚至 复杂的 实施。

所以对于 UnpooledHeapByteBuf returning 0 的情况,但这并不意味着 ByteBuf 没有其他实现需要不同的实现.


该方法应该按照 文档 的规定执行,您可以想象其他实现确实有一个 不同的偏移量 0。例如,如果他们使用类似 circular-array 的东西作为后备字节数组。

在这种情况下,该方法需要 return index 当前 start pointer 所在的位置而不是0.

这是一个示例图像,显示了这样一个圆形数组(当前指针位于索引 2 而不是 0,它在使用它时围绕数组移动):


并且在用户端,如果你想安全地使用你的ByteBuf对象你也应该使用方法。如果你在 UnpooledHeapByteBuf 上操作,你可以避免使用它,但即使那样你也不应该使用它,因为它们可能会改变未来版本的内部行为。

不,它一点用都没有,因为它允许我们用一个巨大的字节数组支持多个 ByteBuf 实现。这实际上是在 PooledHeapByteBuf

中完成的