[java] 공개 정적 최종 필드가있는 클래스와 Java 열거의 장점은 무엇입니까?

C #에 익숙하지만 Java에서 더 많은 작업을 시작합니다. Java의 열거 형은 기본적으로 C #의 열거 형과 동일하지만 실제로는 그렇지 않습니다. 처음에는 Java 열거 형에 매우 유리한 여러 조각의 데이터가 포함될 수 있음을 알게되어 기뻤습니다 ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ). 그러나 그 이후로 열거 형 요소에 특정 값을 쉽게 할당 할 수있는 능력과 적절한 노력없이 정수를 열거 형으로 변환하는 기능과 같이 C #에서 사소한 많은 기능이 누락되었습니다. 즉 정수 값을 일치하는 Java Enum으로 변환하십시오 .

그래서 내 질문은 이것입니다 : 많은 공개 정적 최종 필드가있는 클래스에 비해 Java 열거에 이점이 있습니까? 아니면 더 간단한 구문을 제공합니까?

편집 : 더 명확하게하겠습니다. 같은 유형 의 공개 정적 최종 필드 많은 클래스에 비해 Java 열거 형의 이점은 무엇입니까 ? 예를 들어 첫 번째 링크의 행성 예에서 다음과 같은 공용 상수를 사용하는 클래스보다 열거 형의 장점은 무엇입니까?

public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);
public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);
public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);
public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);
public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);
public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);
public static final Planet NEPTUNE = new Planet(1.024e+26, 2.4746e7);

내가 알 수있는 한, casablanca의 대답은 이것을 충족시키는 유일한 것입니다.



답변

기술적으로 열거 형을 여러 유형의 상수가있는 클래스로 볼 수 있으며 실제로는 열거 형 상수가 내부적으로 구현되는 방식입니다. enum그러나를 사용 하면와 같이 스스로 구현 해야하는 유용한 메소드 ( Enum javadoc )가 제공됩니다 Enum.valueOf.


답변

  1. 안전 및 가치 안전을 입력하십시오.
  2. 싱글 톤 보장.
  3. 메소드를 정의하고 대체하는 기능.
  4. 의 값을 사용할 수있는 기능 switchcase자격없이 문을.
  5. 다음을 통한 값의 내장 순차 ordinal().
  6. 가치가 아닌 이름으로 직렬화하여 미래를 보장합니다.
  7. EnumSet그리고 EnumMap수업.

답변

아무도 switch진술 에서 그것들을 사용할 수있는 능력을 언급하지 않았다 . 나는 그것을 넣을 것이다.

이것은 임의로 복잡한 열거 형을 사용하여 instanceof잠재적으로 혼란스러운 if시퀀스 또는 문자열이 아닌 / int 스위칭 값 을 사용하지 않고 깨끗한 방식으로 사용할 수 있습니다 . 표준 예는 상태 머신입니다.


답변

주요 장점은 형식 안전성입니다. 상수 세트를 사용하면 동일한 내장 유형의 모든 값을 사용하여 오류가 발생할 수 있습니다. 열거 형을 사용하면 적용 가능한 값만 사용할 수 있습니다.

예를 들어

public static final int SIZE_SMALL  = 1;
public static final int SIZE_MEDIUM = 2;
public static final int SIZE_LARGE  = 3;

public void setSize(int newSize) { ... }

obj.setSize(15); // Compiles but likely to fail later

vs

public enum Size { SMALL, MEDIUM, LARGE };

public void setSize(Size s) { ... }

obj.setSize( ? ); // Can't even express the above example with an enum


답변

혼란이 적습니다. Font예를 들어 보자 . Font원하는 이름 , 크기 및 스타일 ( new Font(String, int, int)) 을 갖는 생성자가 있습니다. 오늘날까지 스타일이나 크기가 먼저되는지 기억이 나지 않습니다. 경우 Font사용했다 enum그것의 다른 스타일의 모든을 ( PLAIN, BOLD, ITALIC, BOLD_ITALIC), 생성자는 같을 것이다 Font(String, Style, int)혼란을 방지. 불행히도 클래스가 만들어 enum졌을 때 s는 없었고 FontJava는 역 호환성을 유지해야하기 때문에 항상이 모호함에 시달릴 것입니다.

물론 이것은 상수 enum대신에 사용하는 인수 일뿐 public static final입니다. 열거 형은 싱글 톤에 적합 하며 기본 동작을 구현하면서 나중에 사용자 정의 할 수 있습니다 (IE 전략 패턴 ). 후자의 예는 다음 java.nio.file의 ‘ OpenOptionStandardOpenOption개발자가 자신이 아닌 표준을 만들려는 경우 :은 OpenOption, 그가 할 수.


답변

여기에는 많은 좋은 대답이 있지만 열거 형을 위해 특별히 Collection API 클래스 / 인터페이스의 구현고도로 최적화 되었다는 언급은 없습니다 .

이 열거 형 특정 클래스는 Enum인스턴스 만 허용 합니다 ( EnumMap유일하게 허용 함)Enum 하고 (키로 ) 가능할 때마다 구현시 간결한 표현 및 비트 조작으로 되돌아갑니다.

이것은 무엇을 의미 하는가?

우리의 Enum타입이 64 개 이하의 요소를 가지고 있지 않다면 (실제 Enum예제의 대부분 이 이것에 적합 할 것입니다), 구현은 요소를 단일 long값으로 저장합니다 Enum. 문제의 각 인스턴스는이 64 비트 길이의 비트와 연관됩니다 long. 에 요소를 추가하는 EnumSet것은 단순히 적절한 비트를 1로 설정하는 것입니다. 제거하는 것은 해당 비트를 0으로 설정하는 것입니다. 요소가 있는지 테스트하는 Set것은 하나의 비트 마스크 테스트입니다! 이제 당신 Enum은 이것을 사랑해야 합니다!


답변

예:

public class CurrencyDenom {
   public static final int PENNY = 1;
 public static final int NICKLE = 5;
 public static final int DIME = 10;
public static final int QUARTER = 25;}

자바 상수의 제한

1) 형식 안전 없음 : 우선 형식 안전 이 아닙니다. 유효한 int 값을 int에 지정할 수 있습니다 (예 : 99) 해당 값을 나타내는 동전이 없습니다.

2) 의미없는 인쇄 :이 상수 중 하나를 인쇄하면 의미있는 동전 이름 대신 숫자 값이 인쇄됩니다. 예를 들어 NICKLE을 인쇄하면 “NICKLE”대신 “5”가 인쇄됩니다.

3) 네임 스페이스 없음 : currencyDenom 상수에 액세스하려면 PENNY를 사용하는 대신 클래스 이름 앞에 CurrencyDenom.PENNY를 접두사로 지정해야하지만 JDK 1.5에서 정적 가져 오기를 사용하여 수행 할 수도 있습니다

열거 형의 장점

1) Java의 열거 형은 형식이 안전하며 자체 네임 스페이스가 있습니다. 아래 예의 열거 형에는 예를 들어 “통화”와 같은 유형이 있으며 열거 형 상수에 지정된 값 이외의 값은 할당 할 수 없습니다.

public enum Currency {PENNY, NICKLE, DIME, QUARTER};

Currency coin = Currency.PENNY;
coin = 1; //compilation error

2) Java의 Enum은 클래스 또는 인터페이스와 같은 참조 유형이며 Java Enum 유형의 다음 예에 표시된 것처럼 C 및 C ++의 Enum보다 강력한 Enum 내에서 생성자, 메소드 및 변수를 정의 할 수 있습니다.

3) 아래 예제와 같이 생성시 열거 형 상수 값을 지정할 수 있습니다. public enum Currency {PENNY (1), NICKLE (5), DIME (10), QUARTER (25)}; 그러나 이것이 작동하려면 PENNY (1)이 실제로 int value를 허용하는 생성자를 호출하기 때문에 멤버 변수와 생성자를 정의해야합니다 (아래 예 참조).

public enum Currency {
    PENNY(1), NICKLE(5), DIME(10), QUARTER(25);
    private int value;

    private Currency(int value) {
            this.value = value;
    }
}; 

참조 : https://javarevisited.blogspot.com/2011/08/enum-in-java-example-tutorial.html