#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. Там так много абстракции, что я не могу сказать, какие классы просто «описывают» классы, а какие из них являются самостоятельными и расширяемыми. Я не думаю, что им нужно было разбивать это до сих пор.