UFO ET IT

Enum values ​​(). length 대 개인 필드

ufoet 2021. 1. 6. 20:02
반응형

Enum values ​​(). length 대 개인 필드


다음과 같은 열거 형이 있습니다.

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }
}

때때로 열거에있는 필드 수를 확인해야합니다. 최상의 솔루션은 무엇입니까? "values ​​(). length"메소드를 사용해야합니까? 또는 다음과 같이 열거 형에 상수 필드를 만들어야합니다.

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }

    public static final int Size = 5;
}

가장 빠르고 우아한 솔루션은 무엇입니까?


를 사용 values().length하면 호출 할 때마다 배열의 새 복사본이 생성됩니다. 나는 때때로이 List무의미한 복사를 피하기 위해 내 자신의 (또는 내가 필요한 것을 설정하거나, 맵을) 만듭니다. 나는 그것을 하드 코딩 하지 않을 것입니다 ... 크기 만 필요하면 다음을 사용합니다.

private static final int size = Configuration.values().length;

끝에. 평가 될 때까지 모든 값이 초기화됩니다. 이것은 다른 답변에서 제기되는 DRY 및 불일치 문제를 방지합니다.

물론 이것은 그 자체로 약간의 마이크로 최적화이지만 결국 더 간단한 코드 인 IMO로 끝납니다. values().length다른 곳에서 호출 하는 것은 관심있는 것을 표현하지 않습니다. 이것은 열거 형의 크기 일뿐 입니다. 값 배열을 통해 얻을 수 있다는 사실은 IMO입니다.

사용에 대한 대안은 values()사용하는 것입니다 EnumSet.allOf().size()하지만 단지 것으로 다시 그것을 읽을로 아니다 - 작은 열거 꽤 저렴합니다 size필드.


사용하는 것이 좋습니다 values().length. 이것은 훨씬 더 우아하며 상수를 사용하는 것에 비해 성능 오버 헤드는 무시할 수 있습니다. 또한 열거의 실제 길이와 함께 상수가 단계를 벗어날 위험을 제거합니다.


카운트를 저장하면 DRY 원칙을 위반하는 것이므로 아주 좋은 이유가없는 한 그렇게해서는 안됩니다.


또 다른 방법은 values ​​() 메서드 위에 초기화 된 상수를 사용하는 것입니다.

public enum Colors {
    BLUE, GREEN, FUCHSIA;
    public static int COUNT = Colors.values().length;
}

이렇게하면 자동으로 업데이트 된 상수를 가지면서 "values ​​()"오버 헤드를 피할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/1741708/enum-values-length-vs-private-field

반응형