Java:从 ByteBuffer 扩展

Posted

技术标签:

【中文标题】Java:从 ByteBuffer 扩展【英文标题】:Java : Extending from ByteBuffer 【发布时间】:2011-11-13 07:26:52 【问题描述】:

Java 不允许我从 ByteBuffer 扩展,因为它实现了我没有覆盖的抽象方法,但这些方法适用于任何创建的 ByteBuffer 对象,例如 asDoubleBuffer()...

byte[] bytes = new byte[256];
ByteBuffer buf = ByteBuffer.wrap(bytes);
DoubleBuffer db = buf.asDoubleBuffer();

然而,如果我从 ByteBuffer 扩展一个新类,它会强制我实现 asDoubleBuffer(),即使超类已经实现了这个方法,显然,因为我可以调用它就好了。我完全不明白这里发生了什么......请给我解释一下。

【问题讨论】:

【参考方案1】:

ByteBuffer 工厂方法返回一个实现 ByteBuffer 的类。

byte[] bytes = new byte[256];
ByteBuffer buf = ByteBuffer.wrap(bytes);
System.out.println(buf.getClass());

打印

class java.nio.HeapByteBuffer

使用 ByteBuffer 是一个相对高级的工具,恕我直言,在尝试扩展它之前,您需要非常了解 Java。


您可以通过查看代码来了解这一点。在我的 IDE 中,您可以通过对方法执行 + 来找到它。

public static ByteBuffer wrap(byte[] array) 
    return wrap(array, 0, array.length);

通话

public static ByteBuffer wrap(byte[] array,
                                int offset, int length)

    try 
        return new HeapByteBuffer(array, offset, length);
     catch (IllegalArgumentException x) 
        throw new IndexOutOfBoundsException();
    

顺便说一句:我是使用 ByteBuffer 的忠实拥护者,但是您确实需要了解自己在做什么才能使用它。尤其是从 ByteBuffer 解析数据时。拥有 10 年经验的开发人员发现它很难使用。

【讨论】:

是的,我最终将不得不在类中实现一个 ByteBuffer in,而不是仅仅扩展它并继承它的方法。太多的时间和工作去挖掘那里试图找出哪些类做什么。【参考方案2】:

没关系。我看到当分配一个新的 ByteBuffer 时,它返回一个使用这些抽象方法的子类。创建的对象根本不是真正的 ByteBuffer。让我困惑。不知道他们为什么会使用这种方法。

【讨论】:

你找到了一些东西(类似于?)factory pattern——通常用于提供一个“构造函数”,该构造函数知道如何根据其参数生成正确类型的对象。 @William,它使用工厂方法和多态性调用。这是面向对象设计的基本原则。 最好读的是代码,对于这种方法来说它很短。 ;) 里面有太多的抽象,我不知道哪些类只是“描述”类,哪些是自依赖和可扩展的。到目前为止,我认为他们不需要分解它。

以上是关于Java:从 ByteBuffer 扩展的主要内容,如果未能解决你的问题,请参考以下文章

是否存在允许动态增长和扩展 java.nio.ByteBuffer 的 ByteBuffer 实现?

可以扩展通过 allocateDirect 方法创建的 ByteBuffer 吗?

ByteBuffer 解码时缺少数据为字符串

Netty 之缓冲区 ByteBuf 解读

从 ByteBuffer 中提取 Long (Java/Scala)

Netty中的字节操作