HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[Item 53] EnumSet의 정적 팩터리 예시 #45

Open Limgayoung opened 6 days ago

Limgayoung commented 6 days ago

322 페이지에서 EnumSet의 정적 팩터리도 다중정의 메서드를 이용해 열거 타입 집합 생성 비용을 최소화한다고 했는데 해당 메서드에 대해 설명해주실 수 있나요?

ForteEscape commented 6 days ago

Q.

322 페이지에서 EnumSet의 정적 팩터리도 다중정의 메서드를 이용해 열거 타입 집합 생성 비용을 최소화한다고 했는데 해당 메서드에 대해 설명해주실 수 있나요?

A.


public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java.io.Serializable
{
public static <E extends Enum<E>> EnumSet<E> of(E e) {...}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) {...}

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) {...}

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4) {...}

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5) {...}

@SafeVarargs
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {...}
...

}



- EnumSet의 정적 팩터리 메서드들을 모두 가져온 코드입니다.
- EnumSet의 원소가 5개 이하인 경우에 대해 모두 정적 팩터리 메서드를 다중정의하여 생성한 것을 확인할 수 있습니다. 이를 통해 원소가 5개 이하인 경우에 대해 가변인자를 사용하지 않으므로 성능 이슈를 해결할 수 있습니다.
- 6개 이상인 경우 가변 인자를 사용하게 되는 것을 확인할 수 있는데 아마도 EnumSet의 설계자는 대부분의 EnumSet이 원소가 5개 이하인 경우라고 생각을 하여 이렇게 설계한 것 같습니다.
- EnumSet은 이전 제가 맡았던 부분이기도 한데 비트필드를 사용하던 방식을 열거 타입으로 전환시키기 위해 만든 것이므로
성능에 대해 비트필드와 동등한 수준으로 만들어야 하는데 이를 통해서 잘 최적화했다고 볼 수 있습니다.