2016-06-16 52 views
2

Может ли метод итератора интерфейса List когда-либо возвращать null?Может ли list.iterator() возвращать null?

Я заметил, что много раз люди добавляют нулевые проверки для list.iterator. Мы действительно требуем эту проверку.

Javadocs не упоминает итератор, чтобы вернуть null, поэтому хотел подтвердить.

ссылка: https://docs.oracle.com/javase/7/docs/api/java/util/List.html#iterator()

+0

Я никогда бы не проверить нуль при возврате из list.iterator(). Конечно, нуль-проверка в списке может быть разумной. – Michal

+1

Нет, мы не требуем этой проверки. Если он не указан в Javadoc, он не может вернуть значение null. Вы не можете идти тем, что «много раз люди [делали]». Это не демократия. Избыточный код всегда ошибочен. – EJP

+0

Можете ли вы привести пример того, где кто-то использует эту проверку? На самом деле не имеет большого значения, что List возвращает null для итератора. – matt

ответ

8

List является интерфейсом. Может ли List.iterator() вернуться null зависит от реализации интерфейса List, который вы используете.

Реализация стандартных классов, таких как java.util.ArrayList и java.util.LinkedList никогда не возвращается null, так что если вы используете эти он никогда не нужно проверить, если List.iterator() возвращается null.

Вы можете подтвердить это, посмотрев исходный код этих классов, который вы можете найти в файле src.zip в каталоге установки JDK.

В принципе можно иметь странную реализацию интерфейса List, который будет возвращать null, но это было бы очень странно, и не то, что разработчики могут ожидать от List.

+0

Вы правы, я проголосовал за это, потому что этот момент я не думал, прежде чем читать ваш ответ, но ясно одно: если какая-либо реализация возвращает null, то это действительно странная и странная реализация. : P – pbajpai21

+0

Может ли 'List.iterator()' возвращать значение null, зависит от того, разрешено ли оно контрактом, указанным для интерфейса, и это не так. – EJP

+0

@EJP интерфейс не может ** заставить ** реализации не возвращать 'null'. Есть разница между «can» и «should». – Jesper

2

Нет, list.iterator() не может вернуть null. Он всегда будет возвращать объект класса, который имеет тип Iterable (реализующий интерфейс Iterable).

Даже в исходном коде: метод iterator() возвращает новый итерируемый объект, используя новое ключевое слово, поэтому нет шансов на null. Ниже приведен код метода ArrayList класса итератора():

/** 
    * Returns an iterator over the elements in this list in proper sequence. 
    * 
    * <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>. 
    * 
    * @return an iterator over the elements in this list in proper sequence 
    */ 
    public Iterator<E> iterator() { 
     return new Itr(); 
    } 

Здесь Itr is a inner class defined in ArrayList сам класс. Я видел некоторые из реализаций List в исходном коде JDk, и я обнаружил, что везде, где было использовано новое ключевое слово, было возвращено объект-итератор, поэтому я считаю, что нет никакой нулевой проверки для list.iterator().

Даже когда я попытался следующий код в IntelliJ IDE я нашел в IDE информацию о том, что: «Condition 'iterator != null' is always 'true'»

 List<String> list = new ArrayList<>(); 
     Iterator<String> iterator = list.iterator(); 
     if(iterator != null) { 
     System.out.println(""); 
     } 
+0

правильно, и, например, для emptylist будет EmptyIterator \t частный статический класс EmptyList расширяет AbstractList реализует RandomAccess, Serializable { .. общественного Итератор итератор() { возвращение emptyIterator(); } \t \t \t \t общественность статической итератор emptyIterator() { возврата (итератор ) EmptyIterator.EMPTY_ITERATOR;} – user3136131

+2

Конечно, этот метод может возвращать 'null'. Я могу очень реализовать свой собственный список и просто реализовать метод для этого. Вопрос в том, имеет ли смысл это еще один ... Однако, правильно, что стандартные реализации, поставляемые с JDK, никогда не возвращают здесь null. – Ray

+0

@ Ray, я согласен с вами, но я видел во встроенных реализациях в Java и обнаружил, что везде возвращается объект итератора, но если вы создаете реализацию List и затем возвращаете null в метод iterator(), тогда в мое мнение о его нехорошем дизайне, ваш метод должен выполнять все, что он говорит. – pbajpai21