Java 에서 Collections.empty List()의 주의사항

우연히 동료 가 Collections.empty List()방법 을 잘못 사용 한 것 을 발 견 했 습 니 다.여기에 기록 하 세 요.그녀의 사용 방식 은:

public void run() {
  ......
  List list = buildList(param);
  ......
  Object newNode = getNode(...);
  list.add(newNode);
  ......
}
 
public List buildList(Object param) {
  if (isInValid(param)) {
    return Collections.emptyList();
  } else {
    ......
  }
}
buildList 방법 에 서 는'빈 List'를 되 돌려 줄 수 있 습 니 다.나중에 이 List 에 요 소 를 추가 하거나 제거 할 수도 있 습 니 다.그러나 Collections.empty List 방법 에 주의 하지 않 고 EMPTY 를 되 돌려 줍 니 다.LIST:

public static final <T> List<T> emptyList() {
  return (List<T>) EMPTY_LIST;
}
이것 은 static final 수식 의 구성원 변수 입 니 다.Empty List 클래스 의 인 스 턴 스 입 니 다.

public static final List EMPTY_LIST = new EmptyList<>();
이 Empty List 는 정적 내부 클래스 로 Array List 와 마찬가지 로 AbstractList 에서 계승 합 니 다.

private static class EmptyList<E>
    extends AbstractList<E>
    implements RandomAccess, Serializable {
    private static final long serialVersionUID = 8842843931221139166L;
 
    public Iterator<E> iterator() {
      return emptyIterator();
    }
    public ListIterator<E> listIterator() {
      return emptyListIterator();
    }
 
    public int size() {return 0;}
    public boolean isEmpty() {return true;}
 
    public boolean contains(Object obj) {return false;}
    public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
 
    public Object[] toArray() { return new Object[0]; }
 
    public <T> T[] toArray(T[] a) {
      if (a.length > 0)
        a[0] = null;
      return a;
    }
 
    public E get(int index) {
      throw new IndexOutOfBoundsException("Index: "+index);
    }
 
    public boolean equals(Object o) {
      return (o instanceof List) && ((List<?>)o).isEmpty();
    }
 
    public int hashCode() { return 1; }
 
    // Preserves singleton property
    private Object readResolve() {
      return EMPTY_LIST;
    }
  }
이 EmptList 는 add 방법 을 다시 쓰 지 않 았 고 get 방법 도 Index OutOf Bounds Exception 이상 을 직접 던 지 는 것 을 볼 수 있 습 니 다.add 를 다시 쓰 는 방법 이 없 으 니 부모 클래스 AbstractList 의 add 방법 을 보 세 요.

public boolean add(E e) {
  add(size(), e);
  return true;
}
 
public void add(int index, E element) {
  throw new UnsupportedOperationException();
}
직접 던 진 Unsupported Operation Exception 이상 을 볼 수 있 습 니 다.다시 Empty List 류 로 돌아 가면 대외 적 으로 제공 하 는 방법 도 사용 범 위 를 뚜렷하게 제한 했다.
Collections.empty List()또는 Collections.EMPTYLIST,빈 목록 의 표지 로 만 생각 하 는 것 이 좋 습 니 다.만약 프로그램의 일부 분기 논리 가 이러한 인 스 턴 스 를 되 돌려 준다 면 테스트 할 때 덮어 쓰 지 않 았 을 것 입 니 다.생산 환경 에서 이 분기 논리 에 이 르 렀 다 면 번 거 로 울 것 입 니 다~
총결산
자바 의 Collections.empty List()주의사항 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 Collections.empty List()에 관 한 주의 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기