API java 5 и больше: я должен возвратить массив или Набор?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

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

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

31
задан Community 23 May 2017 в 12:08
поделиться

4 ответа

Предпочтите Набор (или Список или Набор как соответствующий) к массиву. С дженериками Вы получаете проверку типа, которая испытывала недостаток в предварительном Java 5. Кроме того, путем представления только интерфейса, Вы свободны изменить реализацию позже (например, переключить ArrayList для LinkedList).

Массивы и дженерики не смешиваются очень хорошо. Так, если Вы хотите использовать в своих интересах дженерики, Вы должны обычно , избегают массивов.
Т.е.: Вы не можете в общем создать массив. Например, если T является универсальным типом затем "новый T [0]", не компилирует. Необходимо было бы сделать что-то как" (T []) новый Объект [0]", который генерирует предупреждение броска непроверенное. По той же причине Вы не можете использовать универсальные типы с varargs без предупреждений.

Используя Collections.unmodifiableCollection (и похожие методы), Вы получаете ограничение только для чтения (которого Вы не можете достигнуть с массивом - необходимо было бы возвратить клон массива).

Вы не можете осуществить неизменность участников, но затем Вы не можете сделать этого с массивом также.

37
ответ дан 27 November 2019 в 22:17
поделиться

Мой ответ был downvoted, потому что я использую прокси для класса, и использование подобных вещей (прокси и отражение) является forbitten, потому что это влияет на производительность умов некоторых людей (многие люди даже не используют отражение, однако они используют, в спящем режиме и пружина, которые используют отражение, прокси класса и xml).

Усилитель из проекта cglib.sourceforge.net, это позволяет создавать прокси для классов (JDK поддерживает только прокси для Интерфейсов). Прокси позволяет Вам методам управления в объекте, однако Вы наклоняете поля доступа с помощью отражений. если у Вас есть некоторые вопросы, спрашивают.

3
ответ дан 27 November 2019 в 22:17
поделиться

Проверьте немодифицируемое* методы в Collections класс для создания возвращенных наборов только для чтения/неизменными. Это перенесет исходный набор в список, который предотвращает доступ к изменению самого списка (сами элементы не неизменны хотя).

unmodifiableList, например.

Для меня это зависит от того, как возвращенный список будет использоваться. Что другие методы то, чтобы это было переданным, и как это будет использоваться? В целом я предпочел бы универсальный набор по массиву, но изменю его на индивидуальной основе.

массив будет, вероятно, работать быстрее также при выполнении чего-то критического.

4
ответ дан 27 November 2019 в 22:17
поделиться

На самом деле массивы все еще имеют преимущество перед Наборами/Списками. Из-за способа, которым Java реализует Дженерики через стирание типа, у Вас не может быть двух методов, которые берут Наборы в качестве аргументов все же, только отличаются универсальным типом Набора.

Исключая:

public void doSomething(Collection<String> strs) { ... }
public void doSomething(Collection<Integer> ints) { ... }

два выше методов не скомпилируют, потому что javac стирание типа использования компилятора и таким образом не может передать информацию о типе JVM. JVM будет только видеть два метода, которые берут Набор в качестве его аргумента.

В вышеупомянутых случаях, лучшее обходное решение должно заставить методы взять массивы в качестве своих аргументов и использовать Набор/Список toArray () метод при передаче аргументов им. Если Вы все еще хотите использовать Набор/Список в вышеупомянутых методах, просто используйте java.util. Arrays.asList () метод для возвращения Списка.

Исключая:

public void doSomething(String[] strs) {
        List<String> strList = Arrays.asList(strs);
        ...
}

public void doSomething(Integer[] ints) {
        List<Integer> intList = Arrays.asList(ints);
        ...
}

public static void main(String[] args) {
        List<String> strs = new ArrayList<String>();
        List<Integer> ints = new ArrayList<Integer>();
        obj.doSomething(strs.toArray());
        obj.doSomething(ints.toArray());
}
11
ответ дан 27 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: