2016-06-16 2 views
2

인터페이스 목록의 반복기 메소드가 null을 반환 할 수 있습니까?Can.iterator()는 null을 반환 할 수 있습니까?

많은 사람들이 list.iterator에 대해 null 체크를 추가하는 것으로 나타났습니다. 우리는 실제로이 수표가 필요한가?

Javadocs는 null을 리턴하는 반복자에 대해서는 언급하지 않으므로 확인하고 싶습니다.

링크 : https://docs.oracle.com/javase/7/docs/api/java/util/List.html#iterator()

+0

(). 물론 목록에서 null 체크만으로도 합리적 일 수 있습니다. – Michal

+1

아니요, 우리는이 수표를 요구하지 않습니다. Javadoc에 기술되어 있지 않은 경우, null를 돌려 줄 수가 없습니다. 사람들이 여러 번 '무엇을 할 것인가'로 갈 수는 없습니다. 그것은 민주주의가 아닙니다. 중복 코드는 항상 잘못되었습니다. – EJP

+0

누군가이 수표를 사용하는 예를 제공 할 수 있습니까? List가 반복자에 대해 null을 반환한다는 것은별로 의미가 없습니다. – matt

답변

8

List는 인터페이스입니다. List.iterator()null을 반환 할 수 있는지 여부는 사용중인 인터페이스 List의 구현에 따라 다릅니다.

결코 당신이 사용하는 경우가 List.iterator() 경우 반환 null을 확인하는 데 필요한 절대 노출되지 않도록, null을 반환 등 java.util.ArrayListjava.util.LinkedList 표준 클래스의 구현입니다.

JDK 설치 디렉토리의 src.zip 파일에서 찾을 수있는 해당 클래스의 소스 코드를보고이를 확인할 수 있습니다.

는 원칙적으로는 null을 반환 인터페이스 List의 이상한 구현을 가질 수 있습니다,하지만 개발자가 List에서 무엇을 기대 정말 이상하지 것이다.

+0

당신은 정확합니다, 나는 이것을 위해 투표했습니다. 왜냐하면 당신의 대답을 읽기 전에이 점을 생각하지 않았기 때문에, 한 가지 확실합니다. 어떤 구현이 null을 반환한다면, 정말로 이상하고 이상한 구현입니다. : P – pbajpai21

+0

'List.iterator()'가 null을 리턴 할 수 있는지 여부는 인터페이스에 지정된 계약에 의해 허용되는지 여부에 달려 있습니다. – EJP

+0

@EJP 인터페이스는 구현이 ** null을 리턴하지 못하도록 강제 할 수 없습니다. "할 수있다"와 "해야한다"는 차이가 있습니다. – Jesper

2

아니요, list.iterator()는 null을 반환 할 수 없습니다. 항상 Iterable (Iterable 인터페이스 구현) 유형의 클래스 객체를 반환합니다.

소스 코드에서도 : iterator() 메서드는 new 키워드를 사용하여 새로운 iterable 개체를 반환하므로 null이 될 가능성이 없습니다.

다음
/** 
    * 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 클래스 자체 : 아래의 ArrayList 클래스의 반복자() 메서드의 코드입니다. JDk 소스 코드에서 List 구현물 중 일부를 보았습니다. 모든 곳에서 iterator 객체를 반환하기 위해 new 키워드가 사용되었으므로 list.iterator()에 대해 null 체크가 필요하지 않다고 생각합니다. 내가 IntelliJ에 IDE에서 아래의 코드를 시도하더라도

는 그 말 IDE 정보에있는 "Condition 'iterator != null' is always 'true'"나는 list.iterator에서 RETURN에 널 (null)을 확인하지 않을 것

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

EmptyIterator 정확하고 빈리스트에 대한 예는 것이다 \t 가 AbstractList를 확장 빈리스트 개인 정적 클래스 직렬화 가능해, RandomAccess를 구현 { .. 공개 반복자 반복기() { 복귀 emptyIterator(); } \t \t \t \t 공용 static 반복자 emptyIterator() { 창 (반복자 ) EmptyIterator.EMPTY_ITERATOR} – user3136131

+2

물론이 방법은'null'를 반환 할 수있다. 나는 대단히 자신의 List를 구현할 수 있고 그렇게하기위한 메소드를 구현할 수있다. 이것이 의미가 있는지 의문입니다. 그러나, JDK에 포함 된 표준 구현은 결코 null을 반환하지 않습니다. – Ray

+0

@ 레이, 나는 당신과 동의하지만, Java의 내장 목록 구현에서 보았을 때 어디에서나 반복자 객체가 반환된다는 것을 알았지 만, List 구현을 작성한 다음 iterator() 메소드에서 null을 반환하면 내 의견은 좋은 디자인이 아니라, 당신의 방법은 그것이 무엇이든 수행해야합니다. – pbajpai21

관련 문제