[英]Is ByteBuf.arrayOffset useless?
我正在学习Netty in Action。
在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()
方法的用例是什么。 该方法的文档如下:
返回此缓冲区的后备字节数组中第一个字节的偏移量。
然后,我在arrayOffset()
中UnpooledHeapByteBuf.java
了实现ByteBuf
的arrayOffset()
方法。 该方法的实现始终只返回0
,如下所示。
@Override
public int arrayOffset() {
return 0;
}
那么, ByteBuf#arrayOffset
没用的吗?
ByteBuf
可能还有其他实现,它们可能有更有用甚至更复杂的实现。
因此,对于UnpooledHeapByteBuf
返回0
工作的情况,但这并不意味着没有其他需要不同实现的ByteBuf
实现。
该方法应该执行文档所述的内容 ,您可以想象其他实现确实具有与0
不同的偏移量。 例如,如果他们使用类似圆形数组的东西作为后备字节数组。
在这种情况下,该方法需要返回当前开始指针所在的索引而不是0
。
这是一个显示这样一个圆形数组的示例图像(当前指针位于索引2
而不是0
,它在使用时在数组周围移动):
在用户端 ,如果您想安全地使用 ByteBuf
对象,您也应该使用该方法。 如果你使用UnpooledHeapByteBuf
你可以避免使用它,但即便如此,你也不应该因为它们可能会改变未来版本的内部行为。
不,它根本没用,因为它允许我们有一个巨大的字节数组支持多个ByteBuf实现。 这实际上是在PooledHeapByteBuf中完成的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.