Зачем нам нужен метод hasArray () в CharBuffer? - PullRequest
0 голосов
/ 31 марта 2019

CharBuffer имеет методы array() и hasArray().

Зачем нам нужно hasArray()?

После CharBuffer buf = CharBuffer.allocate(20), hasArray() всегда верно, прежде чем - мы не можем использовать ссылку на буферизацию b / c, она не инициализирована.

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Да, но:

System.out.println(ByteBuffer.allocateDirect(100).asCharBuffer().hasArray());

возвращает false.

И даже если это не так, заранее неизвестно, как был получен буфер.Вы можете представить, что ОС выделяет буфер и что он просто используется Java, например, при открытии текстового файла.То, что вы не можете непосредственно выделить его самостоятельно, несущественно.

Кроме того, hasArray() - это функция, определенная в родительском классе Buffer, поэтому для необходимо , чтобытолько по этой причине.


Как показывает другой ответ, при извлечении массива, доступного только для чтения, из документации также возвращается false:

trueтогда и только тогда, когда этот буфер поддерживается массивом и не предназначен только для чтения

, это имеет смысл, поскольку вы не хотите передавать буфер только для чтения, только для его изменениякто-то извлекает резервный массив и таким образом записывает данные в массив;Java-массивы всегда изменчивы.

1 голос
/ 31 марта 2019

Условием для hasArray является

(hb != null) && !isReadOnly

isReadOnly изменяется, если вы используете asReadOnlyBuffer

CharBuffer.allocate(20).asReadOnlyBuffer();

например.
Так что да, нам это нужно.


Возьми эту строку

final CharBuffer cb = instance.getCharBuffer(...);

Это только для чтения или нет? Содержит ли он действительный массив char[]? Мы действительно не знаем. Если мы сделаем

cb.array();

и это буфер только для чтения, мы получаем ReadOnlyBufferException.
Если он не поддерживается массивом char[], мы получаем UnsupportedOperationException.

Итак, что мы могли бы сделать, это

if (cb.hasArray()) {
   final char[] arr = cb.array();
}

Теперь мы Exception -безопасны.
Кроме того, вы можете быть уверены, что инженеры Oracle / OpenJDK / whatJDK знают, что они делают;)

...