programing

에넘이란 무엇이며 왜 유용한가?

itsource 2022. 7. 2. 22:54
반응형

에넘이란 무엇이며 왜 유용한가?

이 몇, 질문에 .enum 이러한 솔루션에 대한 스레드 안전상의 이점에 대해 싱글톤 패턴으로 사용된다.

도 써본 적이 없다enums와 나는 자바에서 프로그래밍을 한 지 2년이 넘었습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★이제 그들은 자신들 내부에서 OOP에 대한 전면적인 지원까지 하고 있습니다.

이제 일상 프로그래밍에서 열거형을 사용해야 하는 이유와 내용은 무엇입니까?

변수(특히 방법 매개 변수)가 가능한 작은 값 집합에서 하나만 추출할 수 있는 경우에는 항상 enum을 사용해야 합니다.예를 들어 유형 상수(계약 상태: "permanent", "temp", "apprentice"), 플래그("지금 실행", "defer execution") 등이 있습니다.

정수(또는 문자열 코드) 대신 enum을 사용하는 경우 컴파일 시간 체크를 늘리고 잘못된 상수로 오류가 전달되지 않도록 하며 어떤 값을 사용할 수 있는지 기록합니다.

BTW에서 enum을 과도하게 사용하는 것은 메서드가 너무 많은 것을 의미할 수 있습니다(기능을 변경하는 여러 플래그를 사용하는 방법보다 여러 개의 다른 메서드를 사용하는 것이 더 좋습니다). 그러나 플래그나 입력 코드를 사용해야 하는 경우에는 enum을 사용하는 것이 좋습니다.

예를 들어 어떤 것이 더 좋습니까?

/** Counts number of foobangs.
 * @param type Type of foobangs to count. Can be 1=green foobangs,
 * 2=wrinkled foobangs, 3=sweet foobangs, 0=all types.
 * @return number of foobangs of type
 */
public int countFoobangs(int type)

/** Types of foobangs. */
public enum FB_TYPE {
 GREEN, WRINKLED, SWEET, 
 /** special type for all types combined */
 ALL;
}

/** Counts number of foobangs.
 * @param type Type of foobangs to count
 * @return number of foobangs of type
 */
public int countFoobangs(FB_TYPE type)

다음과 같은 메서드 호출:

int sweetFoobangCount = countFoobangs(3);

그 후, 다음과 같이 됩니다.

int sweetFoobangCount = countFoobangs(FB_TYPE.SWEET);

두 번째 예에서는 어떤 유형이 허용되는지 즉시 명확해지고 문서와 구현이 동기화되지 않으며 컴파일러는 이를 강제할 수 있습니다.또, 다음과 같은 무효 콜도 있습니다.

int sweetFoobangCount = countFoobangs(99);

더 이상 불가능합니다.

프로그래밍 언어 기능을 사용하는 이유는 무엇입니까?우리가 언어를 사용하는 이유는

  1. 프로그래머는 알고리즘을 컴퓨터가 사용할 수 있는 형태로 효율적이고 정확하게 표현합니다.
  2. 유지관리자는 다른 사용자가 작성한 알고리즘을 이해하고 올바르게 변경합니다.

에넘은 많은 양의 보일러 플레이트를 쓰지 않고도 정확성과 가독성을 모두 향상시킵니다.보일러 플레이트를 작성할 의향이 있는 경우는, 다음과 같이 에넘을 「시뮬레이트」할 수 있습니다.

public class Color {
    private Color() {} // Prevent others from making colors.
    public static final Color RED = new Color();
    public static final Color AMBER = new Color();
    public static final Color GREEN = new Color();
}

이제 다음을 쓸 수 있습니다.

Color trafficLightColor = Color.RED;

위의 보일러 플레이트는 다음과 같은 효과가 있습니다.

public enum Color { RED, AMBER, GREEN };

둘 다 컴파일러에서 동일한 수준의 체크 도움말을 제공합니다.보일러 플레이트는 타이핑에 가까울 뿐이죠.그러나 타이핑을 많이 저장하면 프로그래머의 효율성이 향상되므로(1 참조) 유용한 기능입니다.

적어도 한 가지 이유가 더 있습니다.

스위치 문

static final위의 열거형 시뮬레이션은 좋은 결과를 제공하지 않습니다.switch 스위치는 열거형의 범위를 추측합니다.enum Color위에서는 이렇게만 말하면 됩니다.

Color color = ... ;
switch (color) {
    case RED:
        ...
        break;
}

해 주세요. ★★★★★★★★★★★★★★★★★★★★★★★★」Color.RED않을 enum과 함께 사용할 수 있는 유일switch음음음같 뭇매하다

public Class Color {
    public static final int RED = 0;
    public static final int AMBER = 1;
    public static final int GREEN = 2;
}

이제 는 유형으로 되어 합니다.int 및 .enum .static final시뮬레이션은 없어졌습니다.행복하지 않습니다.

시뮬레이션에서 스칼라 값 멤버를 사용하는 것이 타협입니다.

public class Color {
    public static final int RED_TAG = 1;
    public static final int AMBER_TAG = 2;
    public static final int GREEN_TAG = 3;

    public final int tag;

    private Color(int tag) { this.tag = tag; } 
    public static final Color RED = new Color(RED_TAG);
    public static final Color AMBER = new Color(AMBER_TAG);
    public static final Color GREEN = new Color(GREEN_TAG);
}

지금:

Color color = ... ;
switch (color.tag) {
    case Color.RED_TAG:
        ...
        break;
}

하지만 참고하세요, 더 많은 보일러 플레이트!

enum을 싱글톤으로 사용

위의 보일러 플레이트에서 열거형이 싱글톤을 구현하는 방법을 제공하는 이유를 알 수 있습니다.쓰는 대신:

public class SingletonClass {
    public static final void INSTANCE = new SingletonClass();
    private SingletonClass() {}

    // all the methods and instance data for the class here
}

접속을 하고 있습니다.

SingletonClass.INSTANCE

라고 말할 수 있다

public enum SingletonClass {
    INSTANCE;

    // all the methods and instance data for the class here
}

우리에게도 같은 것을 주는 거죠.자바 enum은 통사설탕을 약간 뿌리는 풀클래스로 구현되기 때문에 이 문제를 피할 수 있습니다.이것은 다시금 덜 상용화 되었지만, 당신에게 이 관용어가 친숙하지 않다면 분명하지 않다.싱글톤에게는 의미가 없지만 다양한 열거 함수를 얻을 수 있다는 사실도 싫습니다.ord ★★★★★★★★★★★★★★★★★」values 더 시뮬레이션이 Color extends Integer 왜 더 하게 알 수 .enum더 좋은 아이디어입니다.)

스레드 안전성

스레드 안전은 싱글톤이 잠금 없이 느릿느릿 생성될 때만 잠재적인 문제가 됩니다.

public class SingletonClass {
    private static SingletonClass INSTANCE;
    private SingletonClass() {}
    public SingletonClass getInstance() {
        if (INSTANCE == null) INSTANCE = new SingletonClass();
        return INSTANCE;
    }

    // all the methods and instance data for the class here
}

가 ""를 호출하는 getInstanceINSTANCE무효로 하다인스턴스는 수에 관계없이 생성할 수 있습니다.큰일 났다.유일한 해결책은 추가입니다.synchronized(변수 보호)INSTANCE.

「」, 「」는static final위의 코드에는 이 문제가 없습니다.클래스 로드 시 인스턴스를 열심히 만듭니다.이치노

enum싱글톤은 처음 사용할 때까지 초기화되지 않기 때문에 사실상 게으릅니다.가 여러 수 .INSTANCE코드도 거의 없는 게으른 초기화 싱글톤을 얻을 수 있습니다.유일한 부정적인 것은 다소 불분명한 구문이다.무슨 일이 일어나고 있는지 알기 위해서는 관용어를 알고 있거나 클래스 로드와 초기화가 어떻게 작동하는지 완전히 이해해야 합니다.

이미 언급한 사용 사례 외에도 기본적인 OOP 가이드라인에 따라 전략 패턴을 구현하는 데 유용한 enum이 종종 있습니다.

  1. 데이터가 있는 코드(즉, 열거형 자체 내에 있거나 종종 열거형 상수 내에 있으므로 메서드를 재정의할 수 있음)가 있어야 합니다.
  2. 클라이언트 코드를 열거형으로 바인드하지 않기 위한 인터페이스(또는 그 이상)의 실장(디폴트 실장 세트만 제공)

가장 간단한 예로는, 다음과 같은 것이 있습니다.Comparator★★★★

enum StringComparator implements Comparator<String> {
    NATURAL {
        @Override
        public int compare(String s1, String s2) {
            return s1.compareTo(s2);
        }
    },
    REVERSE {
        @Override
        public int compare(String s1, String s2) {
            return NATURAL.compare(s2, s1);
        }
    },
    LENGTH {
        @Override
        public int compare(String s1, String s2) {
            return new Integer(s1.length()).compareTo(s2.length());
        }
    };
}

이 "패턴"은 훨씬 더 복잡한 시나리오에서 사용할 수 있으며, 열거와 함께 제공되는 모든 goodies를 폭넓게 활용할 수 있습니다. 인스턴스 반복, 암묵적 순서 의존, 이름으로 인스턴스 검색, 특정 컨텍스트에 적절한 인스턴스를 제공하는 정적 메서드 등입니다.게다가 이 모든 것을 인터페이스 뒤에 숨기고 있기 때문에, 「디폴트 옵션」중에서 사용할 수 없는 것을 필요로 하는 경우에 대비해, 코드는 수정하지 않고 커스텀 실장으로 동작합니다.

모든 논리가 열거형으로 캡슐화된 시간(일별, 주별 등)의 개념 모델링에 성공적으로 적용되는 것을 보았습니다(특정 시간 범위에 대한 올바른 세분화, 각 세분화에 대한 특정 동작을 일정한 방법으로 선택하는 것 등).그리고 여전히,Granularity서비스 계층에서 알 수 있듯이 단순한 인터페이스입니다.

에넘을 특히 강력하게 만드는 것은 템플릿 메서드를 사용할 수 있는 기능입니다.템플릿 메서드를 사용할 수 있습니다.메서드는 기본 열거형의 일부로 각 유형에 의해 재정의될 수 있습니다.또한 이 블로그 투고에서 보여 주듯이 열거에 연결된 동작을 통해 if-else 구성 또는 전환 스테이트먼트가 필요 없습니다.enum.method()원래 조건 내에서 실행되었을 것을 실행합니다.또, 같은 예에서는, 정적 Import를 enum과 함께 사용하는 것과 동시에, 보다 깨끗한 DSL 라이크 코드를 생성하는 것도 나타내고 있습니다.

다른 이 ada에 대한 .equals(),toString() ★★★★★★★★★★★★★★★★★」hashCode()를 구현합니다.Serializable ★★★★★★★★★★★★★★★★★」Comparable

에넘이 제공하는 모든 것의 완전한 개요를 위해 나는 Java 제4판의 Bruce Eckel's Thinking in Java를 강력히 추천한다.이 판은 이 주제에 대한 모든 장을 할애하고 있다.특히, 가위바위보(RoShamBo) 게임을 에넘으로 사용한 예가 눈에 띈다.

Java 문서에서 -

고정된 상수 집합을 나타내려면 항상 열거 유형을 사용해야 합니다.여기에는 태양계의 행성 및 컴파일 시 가능한 모든 값을 알 수 있는 데이터 집합(예: 메뉴의 선택 사항, 명령줄 플래그 등)과 같은 자연 열거 유형이 포함됩니다.

일반적인 예로는 클래스를 열거형인 프라이빗 스태틱 최종 int 상수 세트(적당한 수의 정수 내)로 바꾸는 것입니다.기본적으로 컴파일 시 "something"의 모든 가능한 값을 알고 있다고 생각되는 경우 이를 열거형으로 나타낼 수 있습니다.Enum은 상수가 있는 클래스에 대해 가독성과 유연성을 제공합니다.

열거형에 대해 생각할 수 있는 다른 장점은 거의 없습니다.이들은 항상 특정 열거 클래스의 인스턴스 중 하나입니다(따라서 싱글톤이 도착하면 enum을 사용하는 개념).또 다른 장점은 스위치 케이스스테이트먼트에서 enum을 유형으로 사용할 수 있다는 것입니다.또한 열거형에서 toString()사용하여 읽을 수 있는 문자열로 인쇄할 수도 있습니다.

일상 프로그래밍에서 열거형을 사용해야 하는 이유와 이유는 무엇입니까?

Enum을 사용하여 작은 고정 상수 집합 또는 내부 클래스 모드를 나타내면서 가독성을 높일 수 있습니다.또한 Enums는 메서드 파라미터에 사용할 때 특정 강성을 적용할 수 있습니다.Oracle 사이트의 Planets 예시와 같은 흥미로운 정보를 컨스트럭터에게 전달할 수 있고, 싱글톤 패턴을 만드는 간단한 방법도 있습니다.

::Locale.setDefault(Locale.US)Locale.setDefault(1)는 IDE를 추가할 때에 표시된 고정 값 하도록 강제합니다..을 사용법

Enum자기 계산 방식으로 고정 값 집합을 열거합니다.
코드를 보다 명확하게 하고 오류 발생률도 낮습니다.

""를 하지 않는가 있습니다.String , 「」int 「」가 아닌 「」Enum, ㄴㄴㄴㄴ가요?

  1. 컴파일러는 에넘 자체가 타입이기 때문에 오타를 허용하지 않습니다.또한 고정 세트 이외의 값도 허용하지 않습니다.결과:
    • 전제 조건(또는 매뉴얼)을 작성할 필요가 없습니다.if)는한 범위내에
    • 불변형 타입은 무료로 제공됩니다.
  2. 에넘은 다른 클래스와 마찬가지로 행동을 취할 수 있습니다.
  3. 예요.Strings 다릅니다.Enum를 참조해 주세요.

은요, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.Enum의 인스턴스는 클래스입니다.이 클래스에서는 개별 동작을 정의할 수 있습니다.

또한 인스턴스 생성 시(Enum이 로드될 때) 스레드 안전성을 보장하므로 싱글턴 패턴을 단순화하는 데 매우 적합합니다.

블로그에서는 파서용 스테이트 머신 등 어플리케이션의 일부를 소개하고 있습니다.

enum열거, 즉 (여러 가지를) 하나씩 언급하는 것을 의미합니다.

열거형은 고정된 상수 집합을 포함하는 데이터 유형입니다.

또는

enum 닮다class컴파일 시 알려진 고정 인스턴스 세트를 사용합니다.

예를 들어 다음과 같습니다.

public class EnumExample {
    interface SeasonInt {
        String seasonDuration();
    }

    private enum Season implements SeasonInt {
        // except the enum constants remaining code looks same as class
        // enum constants are implicitly public static final we have used all caps to specify them like Constants in Java
        WINTER(88, "DEC - FEB"), SPRING(92, "MAR - JUN"), SUMMER(91, "JUN - AUG"), FALL(90, "SEP - NOV");

        private int days;
        private String months;

        Season(int days, String months) { // note: constructor is by default private 
            this.days = days;
            this.months = months;
        }

        @Override
        public String seasonDuration() {
            return this+" -> "+this.days + "days,   " + this.months+" months";
        }

    }
    public static void main(String[] args) {
        System.out.println(Season.SPRING.seasonDuration());
        for (Season season : Season.values()){
            System.out.println(season.seasonDuration());
        }

    }
}

열거의 장점:

  • enum을 사용하면 런타임에 오류가 발생하지 않도록 컴파일 시 유형의 안전성이 향상됩니다.
  • enum은 스위치로 쉽게 사용할 수 있습니다.
  • 열거를 통과할 수 있습니다.
  • enum에는 필드, 생성자 및 메서드를 포함할 수 있습니다.
  • Enum은 여러 인터페이스를 구현할 수 있지만 Enum 클래스를 내부적으로 확장하므로 클래스를 확장할 수 없습니다.

많은 것을 위해서

이 된다enums 과 똑같다Constant[ ] 필드 및 [ ]aprivate constructor.

예를들면,

public enum Weekday
{
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
} 

컴파일러는 다음과 같이 컴파일합니다.

class Weekday extends Enum
{
  public static final Weekday MONDAY  = new Weekday( "MONDAY",   0 );
  public static final Weekday TUESDAY = new Weekday( "TUESDAY ", 1 );
  public static final Weekday WEDNESDAY= new Weekday( "WEDNESDAY", 2 );
  public static final Weekday THURSDAY= new Weekday( "THURSDAY", 3 );
  public static final Weekday FRIDAY= new Weekday( "FRIDAY", 4 );
  public static final Weekday SATURDAY= new Weekday( "SATURDAY", 5 );
  public static final Weekday SUNDAY= new Weekday( "SUNDAY", 6 );

  private Weekday( String s, int i )
  {
    super( s, i );
  }

  // other methods...
}

열거란 무엇인가

  • enum은 Enumeration a new data type에 대해 정의된 키워드입니다.Typesafe 열거는 자유롭게 사용해야 합니다.특히 이들은 훨씬 오래된 API에서 관련 항목의 집합을 나타내기 위해 사용되는 단순한 String 또는 int 상수의 강력한 대체 수단입니다.

열거를 사용하는 이유

  • enums는 암묵적으로 java.disclass의 최종 서브클래스입니다.열거형
  • 열거형이 클래스의 멤버인 경우 암묵적으로 정적입니다.
  • new는 열거형 자체에서도 열거형과 함께 사용할 수 없습니다.
  • name 및 valueOf는 단순히 열거형 상수의 텍스트를 사용하는 반면, 원하는 경우 toString을 덮어쓰고 콘텐츠를 제공할 수 있습니다.
  • 열거 상수의 경우 등수와 ==는 같은 양이며 서로 바꿔 사용할 수 있습니다.
  • 열거형 상수는 암묵적으로 공개 정적 최종값입니다.

메모

  • enums는 클래스를 확장할 수 없습니다.
  • 열거형은 슈퍼클래스가 될 수 없습니다.
  • 열거 상수의 출현 순서는 "자연 순서"라고 불리며 다른 항목에서 사용되는 순서도 정의합니다. compareTo, 값의 반복 순서, EnumSet, EnumSet.range
  • 열거형에는 생성자, 정적 및 인스턴스 블록, 변수 및 메서드가 포함될 수 있지만 추상 메서드는 포함할 수 없습니다.

다른 사람들이 말하는 것 말고는..제가 예전에 일했던 프로젝트에서는 엔티티(독립 어플리케이션) 간의 많은 커뮤니케이션이 작은 집합을 나타내는 정수를 사용하고 있었습니다.이 되었다.enum하여 " "를 가져옵니다.enumvalue그리고 역도 성립.코드는 깔끔해 보였고, 스위치 케이스의 조작성, 로그에의 기입이 용이했습니다.

enum ProtocolType {
    TCP_IP (1, "Transmission Control Protocol"), 
    IP (2, "Internet Protocol"), 
    UDP (3, "User Datagram Protocol");

    public int code;
    public String name;

    private ProtocolType(int code, String name) {
        this.code = code;
        this.name = name;
    }

    public static ProtocolType fromInt(int code) {
    switch(code) {
    case 1:
        return TCP_IP;
    case 2:
        return IP;
    case 3:
        return UDP;
    }

    // we had some exception handling for this
    // as the contract for these was between 2 independent applications
    // liable to change between versions (mostly adding new stuff)
    // but keeping it simple here.
    return null;
    }
}

enum한 값 1,2:ProtocolType.fromInt(2)「」를 사용해 합니다.myEnumObj.name

이게 도움이 됐으면 좋겠다.

은 Enum의 합니다.Object 클래스Enum라라반 、 izationization ser ser ser 、 serilization 、 사사,,, 、 ,,,,,,,,,,,,,,,,,, 。Enum enum enum 、 enum enum enum enum enum 。의의의의o DAO oooooo 。

다음은 시연할 수 있는 프로그램 예시입니다.

public enum State {

    Start("1"),
    Wait("1"),
    Notify("2"),
    NotifyAll("3"),
    Run("4"),
    SystemInatilize("5"),
    VendorInatilize("6"),
    test,
    FrameworkInatilize("7");

    public static State getState(String value) {
        return State.Wait;
    }

    private String value;
    State test;

    private State(String value) {
        this.value = value;
    }

    private State() {
    }

    public String getValue() {
        return value;
    }

    public void setCurrentState(State currentState) {
        test = currentState;
    }

    public boolean isNotify() {
        return this.equals(Notify);
    }
}

public class EnumTest {

    State test;

    public void setCurrentState(State currentState) {
        test = currentState;
    }

    public State getCurrentState() {
        return test;
    }

    public static void main(String[] args) {
        System.out.println(State.test);
        System.out.println(State.FrameworkInatilize);
        EnumTest test=new EnumTest();
        test.setCurrentState(State.Notify);
        test. stateSwitch();
    }

    public void stateSwitch() {
        switch (getCurrentState()) {
        case Notify:
            System.out.println("Notify");
            System.out.println(test.isNotify());
            break;
        default:
            break;
        }
    }
}

TYPE SAFETY에는 enum을 사용합니다.이것은 언어 기능이기 때문에, 통상, 다음과 같은 것을 얻을 수 있습니다.

  • 컴파일러 지원(즉시 유형 문제 참조)
  • IDE 툴 지원(스위치 케이스 자동 완료, 케이스 누락, 강제 디폴트 등)
  • Enum 퍼포먼스도 뛰어난 경우도 있습니다(EnumSet, typesafe 대신 기존의 int 기반 비트플래그를 사용합니다)." )

enum에는 메서드, 컨스트럭터를 사용할 수 있습니다.또한 enum 내부에서 enum을 사용하거나 enum을 인터페이스와 조합할 수도 있습니다.

enum은 잘 정의된 int 상수 세트(Java가 C/C++에서 '계승')를 대체하고 경우에 따라 비트플래그를 대체하기 위한 유형으로 간주합니다.

효과적인 Java 2nd Edition이라는 책에는 이러한 문제에 대한 장 전체가 수록되어 있으며 더 자세히 설명되어 있습니다.이 Stack Overflow 투고도 참조해 주세요.

ENum은 "Enumerated Type"의 약자입니다.사용자가 직접 정의하는 고정 상수 집합이 있는 데이터 유형입니다.

지금까지의 답변은 모두 유효하다고 생각합니다만, 제 경험상으로는 몇마디로 표현하겠습니다.

컴파일러가 식별자 값의 유효성을 검사하도록 하려면 enums를 사용합니다.

그렇지 않으면, 지금까지와 같이 문자열을 사용할 수 있습니다(어플리케이션의 「컨벤션」을 정의했을 가능성이 있습니다).그러면, 매우 유연성이 높아집니다.그러나 문자열의 오타에 대한 100% 보안은 얻을 수 없으며 실행 시에만 인식됩니다.

Java를 사용하면 변수를 몇 가지 사전 정의된 값, 즉 열거된 목록에서 하나의 값으로 제한할 수 있습니다.「」를 사용합니다.enums를 사용하면 코드의 버그를 줄일 수 있습니다.를 들면, 이런 입니다.enums[ ] :

enums coffeesize{BIG , HUGE , OVERWHELMING }; 
//This semicolon is optional.

하면 제한된다.coffeesize중 하나를 :BIG,HUGE , 「」OVERWHELMING변수로써.

열거형? 왜 사용해야 하는데?언제 사용할지 더 잘 알 수 있을 것 같아요.저도 같은 경험이 있어요.

데이터베이스 작성, 삭제, 편집 및 읽기 작업이 있다고 가정합니다.

다음으로 enum을 연산으로 작성하는 경우:

public enum operation {
    create("1")
    delete("2")
    edit("3")
    read("4")

    // You may have is methods here
    public boolean isCreate() {
        return this.equals(create);
    }
    // More methods like the above can be written

}

이제 다음과 같이 선언할 수 있습니다.

private operation currentOperation;

// And assign the value for it 
currentOperation = operation.create

그래서 당신은 그것을 여러 가지로 사용할 수 있습니다.위 예의 데이터베이스 조작은 currentOperation을 체크함으로써 제어할 수 있기 때문에 특정 사항에 대한 열거를 갖는 것이 항상 좋습니다.이것은 변수와 정수값으로도 달성할 수 있다고 말할 수 있습니다.하지만 나는 Enum이 더 안전하고 프로그래머의 방법이라고 믿는다.

또 하나:모든 프로그래머들이 부울을 좋아하는 것 같아요, 그렇죠?저장할 수 있는 값은 두 개뿐이므로 두 개의 특정 값은 두 개입니다.따라서 Enum은 사용자가 저장되는 값의 수와 유형을 정의하는 것과 동일한 유형의 기능을 가지고 있다고 생각할 수 있습니다.단, 약간 다른 방식으로만 생각할 수 있습니다.:)

지금까지는 에넘을 사용할 필요가 없었습니다.옛날에는 1.5 버전이나 호랑이로 불렸던 버전부터 계속 읽어왔습니다.그들은 나를 위해 '문제'를 해결하지 못했다.사용하는 분(많은 분이 사용하고 있는 것 같습니다)에게 있어서, 확실히 도움이 될 것입니다.내 2파운드만 줘.

여기에는 많은 답변이 있습니다.다음 두 가지를 말씀드리겠습니다.

의 1) 의 상수로 Switch-case진술.스위치 케이스에서는 String 객체를 케이스에 사용할 수 없습니다.에넘은 유용하게 쓰입니다.상세: http://www.javabeat.net/2009/02/how-to-use-enum-in-switch/

실장 2) ★★Singleton Design Pattern- 또 열거야, 구조하러 와.사용방법, 여기:Java에서 Enum을 싱글톤으로 사용하는 가장 좋은 방법은 무엇입니까?

Ah-Ha의 순간은 Enum이 공개 열거를 통해서만 접근할 수 있는 개인 컨스트럭터를 가지고 있다는 것을 깨달았습니다.

enum RGB {
    RED("Red"), GREEN("Green"), BLUE("Blue");

    public static final String PREFIX = "color ";

    public String getRGBString() {
        return PREFIX + color;
    }

    String color;

    RGB(String color) {
        this.color = color;
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        String c = RGB.RED.getRGBString();
        System.out.print("Hello " + c);
    }
}

향후 코드를 읽을 수 있도록 하기 위해 다음 스니펫에서 가장 유용한 열거 사례를 제시합니다.

public enum Items {
    MESSAGES, CHATS, CITY_ONLINE, FRIENDS, PROFILE, SETTINGS, PEOPLE_SEARCH, CREATE_CHAT
}

@Override
public boolean onCreateOptionsMenu(Menu menuPrm) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menuPrm);
    View itemChooserLcl;
    for (int i = 0; i < menuPrm.size(); i++) {
        MenuItem itemLcl  = menuPrm.getItem(i);
            itemChooserLcl = itemLcl.getActionView();
            if (itemChooserLcl != null) {
                 //here Im marking each View' tag by enume values:
                itemChooserLcl.setTag(Items.values()[i]);
                itemChooserLcl.setOnClickListener(drawerMenuListener);
            }
        }
    return true;
}
private View.OnClickListener drawerMenuListener=new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Items tagLcl= (Items) v.getTag();
        switch (tagLcl){
            case MESSAGES: ;
            break;
            case CHATS : ;
            break;
            case CITY_ONLINE : ;
            break;
            case FRIENDS : ;
            break;
            case  PROFILE: ;
            break;
            case  SETTINGS: ;
            break;
            case  PEOPLE_SEARCH: ;
            break;
            case  CREATE_CHAT: ;
            break;
        }
    }
};

제 경험상 Enum 사용으로 인해 시스템 변경이 매우 어려운 경우가 있습니다.자주 변경되는 도메인별 값 집합에 Enum을 사용하는 경우 Enum에 의존하는 다른 클래스 및 구성 요소가 많이 있는 경우 Enum을 사용하지 않는 것이 좋습니다.

예를 들어 시장/거래소에 Enum을 사용하는 거래 시스템입니다.시장에는 많은 시장이 있으며 이 시장 목록에 액세스해야 하는 서브시스템이 많이 있을 것이 거의 확실합니다.시스템에 새로운 시장을 추가할 때마다, 또는 시장을 없애고 싶을 때마다, 모든 것을 재구축하여 출시해야 할 수도 있습니다.

더 좋은 예는 상품 카테고리 타입과 같은 것입니다.소프트웨어가 백화점의 재고를 관리한다고 가정해 보겠습니다.많은 제품 카테고리가 있으며, 이 카테고리 목록이 변경될 수 있는 많은 이유가 있습니다.관리자는 새 제품군을 비축하고 다른 제품군을 제거하며 때때로 범주를 재구성할 수 있습니다.단순히 사용자가 제품 카테고리를 추가하고 싶다고 해서 모든 시스템을 재구축 및 재구축해야 하는 경우, 단순하고 빠른 것(카테고리 추가)으로 매우 어렵고 느린 것을 선택한 것입니다.

요약하자면, Enums는 나타내는 데이터가 시간에 따라 매우 정적이고 종속성이 제한된 경우에 적합합니다.그러나 데이터가 많이 변경되고 종속성이 많은 경우 컴파일 시 체크되지 않은 동적 데이터(데이터베이스 테이블 등)가 필요합니다.

열거 기반 싱글톤

오래된 문제에 대한 현대적 견해

이 접근법은 Java 프로그램에서 열거값이 한 번만 인스턴스화된다는 Java의 보증을 이용하여 싱글톤을 구현하고 열거형은 스레드 안전에 대한 암묵적인 지원을 제공합니다.Java enum 값은 글로벌하게 액세스할 수 있으므로 싱글톤으로 사용할 수 있습니다.

public enum Singleton {
    SINGLETON; 
    public void method() { }
}

이게 어떻게 작동하나요?코드 2행은 다음과 같이 생각할 수 있습니다.

public final static Singleton SINGLETON = new Singleton(); 

그리고 우리는 좋은 오래된 초기화된 싱글톤을 얻습니다.

이기 때문에 이를 통해 수 .Singleton. SINGLETON아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.

Singleton s = Singleton.SINGLETON;

이점

  • 은 JVMenum.enum JVM에 합니다.Enum serialization 및 、 deserialization 、 Java 、 르르 enum enum enum enum enum enum enum enum 。연재하다valueOfmethod는 역직렬화된 이름과 함께 사용하여 원하는 인스턴스를 가져옵니다.
  • Enum 기반 싱글톤을 사용하면 반사 공격으로부터 자신을 보호할 수 있습니다.은 실제로 합니다.Enum할 수 이유는 에 의해 되지 않으며 이 은 Java의 되어 있기 입니다.newInstance의 of의 Constructor클래스: 일반적으로 반사를 통해 객체를 만드는 데 사용됩니다.
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
    throw new IllegalArgumentException("Cannot reflectively create enum objects");
  • Enum은 각 값의 인스턴스가 하나만 있어야 하므로 복제할 수 없습니다.
  • 모든 싱글톤 실현 중 가장 간결한 코드입니다.

단점들

  • 열거 기반 싱글톤에서는 느린 초기화가 허용되지 않습니다.
  • 설계를 변경하고 싱글톤을 멀티온으로 변환하려는 경우 열거형에서는 이를 허용하지 않습니다.은 여러됩니다.멀티온 인스턴스의 제어된 작성에 됩니다.map. 어플리케이션당1개의 인스턴스가 있는 것이 아니라 (예:java.lang.Runtime) 대신 멀티온 패턴은 키당 하나의 인스턴스를 보장합니다.
  • Enum은 Java 5에만 표시되므로 이전 버전에서는 사용할 수 없습니다.

각각 장단점이 있는 싱글톤 패턴의 실현이 몇 가지 있습니다.

  • 싱글톤을 빠르게 로드하고 있습니다.
  • 이중 체크된 잠금 싱글톤
  • Initialization-on-demand 홀더 아이디
  • 열거 기반 싱글톤

상세한 설명은 각각 너무 장황해서 좋은 기사에 링크를 걸어놨어요-싱글톤에 대해 알고 싶은 모든

을 유용한 지도 개의 에넘을 하지 않도록 .if-else몇몇 、 법법방방방구 경경경 。

public enum Mapping {

    ONE("1"),
    TWO("2");

    private String label;

    private Mapping(String label){
        this.label = label;
    }

    public static Mapping by(String label) {

        for(Mapping m: values() {
            if(m.label.equals(label)) return m;
        }

        return null;
    }

}

by(String label)'Enumerated' 'Non-enumerated' 'Non-enumerated' 입니다. 2개의 2개의 enum., 2개의 enum enum enum enum 에는 할 수 .'1대 1'대 다'다대 다'를 수 .

마내입니다.enum자바, 자바. 하면 .main에 있는 은, 매핑 조작을 합니다.args지금 당장.

많은 선언을 하는 대신

모두 1개의 열거형으로 그룹화할 수 있습니다.

그럼 모두 그들이 속한 공통의 그룹에 의해 조직되고

에넘은 수업과 같다.클래스와 마찬가지로 메서드와 속성도 있습니다.

클래스와의 차이는 다음과 같습니다. 1. 열거형 상수는 public, static, final. 2. 열거형을 사용하여 개체를 만들 수 없으며 다른 클래스를 확장할 수 없습니다.다만, 인터페이스를 실장할 수 있습니다.

@BradB Answer와 함께:

그건 정말...그것을 언급하는 유일한 답변이라는 것이 이상하다.초심자가 에넘을 발견하면 컴파일러의 유효한 식별자 확인을 위한 마법의 트릭으로 받아들입니다.그리고 코드가 분산 시스템에서 사용되도록 되어 있으면, 그들은 울부짖습니다...몇 달 후에고정적이지 않은 값 목록을 포함하는 Enum과의 하위 호환성을 유지하는 것은 매우 우려되는 사항입니다.이는 기존 열거형에 값을 추가하면 해당 유형이 변경되기 때문입니다(이름에 관계없이).

"호, 잠깐만, 같은 타입으로 보일 수도 있지?"결국, 같은 이름의 에넘이니까요. 그리고 에넘은 단지 후드 아래에 정수일 뿐이죠.그리고 이러한 이유로 컴파일러는 다른 정의를 예상한 유형 자체의 사용에 플래그를 붙이지 않을 수 있습니다.하지만 사실, 그것들은 (가장 중요한) 다른 유형입니다.가장 중요한 것은, 서로 다른 데이터 도메인을 가지고 있다는 것입니다. 즉, 이 유형은 허용 가능한 값입니다.값을 추가함으로써 열거형 유형을 효과적으로 변경했기 때문에 하위 호환성이 깨졌습니다.

결론: 원할 때 사용하되, 사용하는 데이터 도메인이 유한하고 이미 알려진 고정 집합인지 확인하십시오.

언급URL : https://stackoverflow.com/questions/4709175/what-are-enums-and-why-are-they-useful

반응형