Зачем нам вообще нужен метод `hasArray()` в CharBuffer?

#java #nio

#java #nio

Вопрос:

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

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

После CharBuffer buf = CharBuffer.allocate(20) , hasArray() всегда имеет значение true, до — мы не можем использовать ссылку buf, потому что она неинициализирована.

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

1. @markspace Нет CharBuffer.allocateDirect() … Это только для ByteBuffer afaik.

Ответ №1:

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

 (hb != null) amp;amp; !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 / whateverJDK знают, что они делают 😉

Ответ №2:

Да, но:

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

ВОЗВРАТ false .

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

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


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

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

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