Java: расширение из ByteBuffer

#java #bytebuffer

#java #bytebuffer

Вопрос:

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 вы можете найти его, выполнив <shift> <щелчок> по методу.

 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. Разработчики с десятилетним опытом находят его сложным в использовании.

Комментарии:

1. Да, в конечном итоге мне придется просто реализовать ByteBuffer в классе, а не просто расширять его и наследовать его методы. Слишком много времени и работы, чтобы копаться там, пытаясь выяснить, какие классы что делают.

Ответ №2:

Неважно. Я вижу, что когда выделяется новый ByteBuffer, он возвращает подкласс, который использует эти абстрактные методы. Созданный объект на самом деле вообще не является ByteBuffer. Меня это сбивает с толку. Не уверен, почему они будут использовать эту методологию.

Комментарии:

1. Вы нашли что-то (похожее на?) фабричный шаблон — обычно используется для предоставления единого «конструктора», который знает, как создать правильный тип объекта на основе его параметров.

2. @William, Он вызывается с использованием заводского метода и полиморфизма. Это основной принцип объектно-ориентированного проектирования.

3. Лучше всего читать код, он довольно короткий для этого метода. 😉

4. Там так много абстракции, что я не могу сказать, какие классы просто «описывают» классы, а какие из них являются самостоятельными и расширяемыми. Я не думаю, что им нужно было разбивать это до сих пор.