아이템 28. 배열보다는 리스트를 사용하라 - KwangtaekJung/book-effective-java GitHub Wiki

  • 제네릭을 사용하지 않은 경우
    • Object의 배열을 사용한다.
    • choose 메서드를 호출할때마다 반환된 Object를 원하는 타입으로 형변환해야 한다.
    • 타입이 다른 원소가 들어 있다면 런타임에 형변환 오류가 발생할 수 있다.
public class Chooser {
    private final Object[] choiceArray;

    public Chooser(Collection choiceArray) {
        this.choiceArray = choiceArray.toArray();
    }

    public Object choose() {
        Random rnd = ThreadLocalRandom.current();
        return choiceArray[rnd.nextInt(choiceArray.length)];
    }
}
  • 제네릭을 사용하는 경우
    • T 배열을 사용하는 것도 가능하지만 비검사 형변환 경고가 발생한다.
    • List를 사용하는 것이 좋다.
public class ChooserGeneric<T> {
//  private final T[] choiceArray;
    private final List<T> choiceArray;

    public ChooserGeneric(Collection<T> choiceArray) {
//      this.choiceArray = (T[]) choiceArray.toArray();
        this.choiceArray = new ArrayList<>(choiceArray);
    }

    public Object choose() {
        Random rnd = ThreadLocalRandom.current();
//      return choiceArray[rnd.nextInt(choiceArray.length)];
        return choiceArray.get(rnd.nextInt(choiceArray.size()));
    }
}