Java(enum) 매거진 상세 정보

개념enum의 전칭은 enumeration으로 JDK 1.5에 도입된 새로운 특성이다.
Java에서 enum 키워드로 수정된 유형은 열거 유형입니다.형식은 다음과 같습니다.

enum Color { RED, GREEN, BLUE }
만약 매거진에 어떤 방법도 추가하지 않는다면, 매거 값은 기본적으로 0부터 시작하는 질서정연한 수치입니다.Color 매거 유형을 예로 들면, 매거 상수는 RED:0, GREEN:1, BLUE:2 순이다.
매거의 장점: 상량을 조직하여 통일적으로 관리할 수 있다.
열거된 전형적인 응용 장면: 오류 코드, 상태기 등.
매거 유형의 본질
비록 enum은 새로운 데이터 유형처럼 보이지만, 사실은enum은 제한된 종류이며, 자신의 방법을 가지고 있다.
enum을 만들 때, 컴파일러는 관련 클래스를 생성합니다. 이 클래스는 java.lang.Enum에서 계승됩니다.java.lang.Enum 클래스 선언

public abstract class Enum<E extends Enum<E>>
    implements Comparable<E>, Serializable { ... }
매거적 방법
enum에서 몇 가지 기본적인 방법을 제공했다.values():enum의 실례를 되돌려주고 이 그룹의 요소는 enum에서 설명할 때의 순서를 엄격하게 유지합니다.name(): 실례 이름을 되돌려줍니다.ordinal(): 실례 성명의 순서를 되돌려줍니다. 0부터 시작합니다.getDeclaringClass(): 실례가 속한enum 형식을 되돌려줍니다.equals(): 동일한 객체인지 여부를 판단합니다. == 을 사용하여 enum의 실례를 비교할 수 있다.
이 밖에 java.lang.EnumComparableSerializable 인터페이스를 실현했으므로compareTo() 방법도 제공한다.
예:enum을 보여주는 기본 방법

public class EnumMethodDemo {
  enum Color {RED, GREEN, BLUE;}
  enum Size {BIG, MIDDLE, SMALL;}
  public static void main(String args[]) {
    System.out.println("=========== Print all Color ===========");
    for (Color c : Color.values()) {
      System.out.println(c + " ordinal: " + c.ordinal());
    }
    System.out.println("=========== Print all Size ===========");
    for (Size s : Size.values()) {
      System.out.println(s + " ordinal: " + s.ordinal());
    }

    Color green = Color.GREEN;
    System.out.println("green name(): " + green.name());
    System.out.println("green getDeclaringClass(): " + green.getDeclaringClass());
    System.out.println("green hashCode(): " + green.hashCode());
    System.out.println("green compareTo Color.GREEN: " + green.compareTo(Color.GREEN));
    System.out.println("green equals Color.GREEN: " + green.equals(Color.GREEN));
    System.out.println("green equals Size.MIDDLE: " + green.equals(Size.MIDDLE));
    System.out.println("green equals 1: " + green.equals(1));
    System.out.format("green == Color.BLUE: %b
", green == Color.BLUE); } }
출력

=========== Print all Color ===========
RED ordinal: 0
GREEN ordinal: 1
BLUE ordinal: 2
=========== Print all Size ===========
BIG ordinal: 0
MIDDLE ordinal: 1
SMALL ordinal: 2
green name(): GREEN
green getDeclaringClass(): class org.zp.javase.enumeration.EnumDemo$Color
green hashCode(): 460141958
green compareTo Color.GREEN: 0
green equals Color.GREEN: true
green equals Size.MIDDLE: false
green equals 1: false
green == Color.BLUE: false
매거적 특성
매거진 특성은 귀결하면 한마디이다.
계승할 수 없는 것을 제외하고는 기본적으로 enum을 일반적인 종류로 간주할 수 있다.
그러나 이 말은 분리해서 이해해야 한다. 우리 자세하게 말하자.
매거에 방법을 추가할 수 있다
개념 장에서 언급한 바와 같이, 매거 값은 기본적으로 0에서 시작하는 질서정연한 수치이다.그러면 문제가 생겼다. 어떻게 매거에 표시할 값을 부여할 것인가.
Java에서는 = 을 매거진 상수로 사용할 수 없습니다.
만약 네가 C/C++를 접촉한 적이 있다면, 너는 틀림없이 자연스럽게 부치 기호 = 을 생각할 것이다.C/C++ 언어의enum에서 값 기호 = 매거 상수로 값을 부여할 수 있습니다.그러나 유감스럽게도 Java 구문에서는 값 기호 = 매거 상수에 값을 부여하는 것을 허용하지 않습니다.
예: C/C++ 언어의 열거 선언

typedef enum{
  ONE = 1,
  TWO,
  THREE = 3,
  TEN = 10
} Number;
enum는 일반적인 방법, 정적 방법, 추상적 방법, 구조 방법을 추가할 수 있다
Java는 실례에 직접 값을 부여할 수 없지만 더 우수한 해결 방안이 있습니다. enum에 간접적으로 값을 표시하는 방법을 추가하는 것입니다. enum 을 만들 때 여러 가지 방법을 추가할 수 있고 구조 방법을 추가할 수도 있습니다.
디테일을 주의하십시오. 만약에enum에 방법을 정의하려면 enum의 마지막 실례 끝에 번호를 추가해야 합니다.또한enum에서는 필드나 방법을 실례 앞에 정의할 수 없는 실례를 먼저 정의해야 합니다.그렇지 않으면 컴파일러가 오류를 보고할 수 있습니다.
예: 어떻게 매거에서 일반 방법, 정적 방법, 추상적 방법, 구조 방법을 정의하는지 전면적으로 보여준다

public enum ErrorCode {
  OK(0) {
    public String getDescription() {
      return " ";
    }
  },
  ERROR_A(100) {
    public String getDescription() {
      return " A";
    }
  },
  ERROR_B(200) {
    public String getDescription() {
      return " B";
    }
  };

  private int code;
  
  //  :enum private 
  private ErrorCode(int number) { //  
    this.code = number;
  }
  public int getCode() { //  
    return code;
  } //  
  public abstract String getDescription(); //  
  public static void main(String args[]) { //  
    for (ErrorCode s : ErrorCode.values()) {
      System.out.println("code: " + s.getCode() + ", description: " + s.getDescription());
    }
  }
}

주: 위의 예는 취할 수 없습니다. 단지 매거 지원 정의의 여러 가지 방법을 보여주기 위해서입니다.다음은 간략한 예이다
예: 오류 코드 매거 유형의 정의
이 예는 이전 예와 실행 결과가 완전히 같다.

public enum ErrorCodeEn {
  OK(0, " "),
  ERROR_A(100, " A"),
  ERROR_B(200, " B");

  ErrorCodeEn(int number, String description) {
    this.code = number;
    this.description = description;
  }
  private int code;
  private String description;
  public int getCode() {
    return code;
  }
  public String getDescription() {
    return description;
  }
  public static void main(String args[]) { //  
    for (ErrorCodeEn s : ErrorCodeEn.values()) {
      System.out.println("code: " + s.getCode() + ", description: " + s.getDescription());
    }
  }
}
매거진으로 인터페이스를 실현할 수 있다enum 은 일반 클래스처럼 인터페이스를 실현할 수 있다.
마찬가지로 이전 절의 오류 코드 매거류를 실현하고 인터페이스를 실현하여 그것을 구속할 수 있는 방법이다.

public interface INumberEnum {
  int getCode();
  String getDescription();
}

public enum ErrorCodeEn2 implements INumberEnum {
  OK(0, " "),
  ERROR_A(100, " A"),
  ERROR_B(200, " B");

  ErrorCodeEn2(int number, String description) {
    this.code = number;
    this.description = description;
  }
  
  private int code;
  private String description;

  @Override
  public int getCode() {
    return code;
  }

  @Override
  public String getDescription() {
    return description;
  }
}

일일이 열거하면 계승할 수 없다
enum은 다른 종류를 계승할 수 없습니다. 물론 다른 enum도 계승할 수 없습니다. enum 은 실제로는 java.lang.Enum 류에서 계승되고 자바는 다중계승을 지원하지 않기 때문에 엔움은 다른 류를 계승할 수 없고 다른 enum류도 계승할 수 없다.
매거진 응용 장면
조직 상량
JDK1.5 이전에 Java에서 정의된 상수는 public static final TYPE a입니다.이런 형식.매거가 있으면 관련 관계의 상량을 조직하여 코드를 더욱 읽기 쉽고 안전하게 할 수 있으며, 매거가 제공하는 방법을 사용할 수 있다.
매거성명 형식
주: 매거에 정의된 방법이 없으면 마지막 실례 뒤에 쉼표, 분호 또는 아무것도 넣지 않을 수도 있습니다.
다음 세 가지 성명 방식은 등가이다.

enum Color { RED, GREEN, BLUE }
enum Color { RED, GREEN, BLUE, }
enum Color { RED, GREEN, BLUE; }
switch 상태기
우리는 자주 switch 문장을 사용하여 상태기를 쓴다.JDK7 이후 switch는 int、char、String、enum 유형의 매개 변수를 지원합니다.이 몇 가지 유형의 매개 변수를 비교하면 매거진 switch 코드를 사용하면 더욱 읽을 수 있다.

enum Signal {RED, YELLOW, GREEN}

public static String getTrafficInstruct(Signal signal) {
  String instruct = " ";
  switch (signal) {
    case RED:
      instruct = " ";
      break;
    case YELLOW:
      instruct = " ";
      break;
    case GREEN:
      instruct = " ";
      break;
    default:
      break;
  }
  return instruct;
}
조직 매거
유형과 비슷한 매거를 인터페이스나 클래스를 통해 구성할 수 있습니다.
하지만 일반적으로 인터페이스 방식으로 조직된다.
원인: 자바 인터페이스는 컴파일할 때 자동으로 enum 형식에 public static 수식자를 추가합니다.Java 클래스는 컴파일할 때 enum 유형에 static 수식자를 자동으로 추가합니다.차이 보이시나요?그렇습니다. 클래스에서 enum을 구성하고 public으로 수식하지 않으면 이 패키지에서만 접근할 수 있습니다.
예: 인터페이스에서 enum 구성

public interface Plant {
  enum Vegetable implements INumberEnum {
    POTATO(0, " "),
    TOMATO(0, " ");

    Vegetable(int number, String description) {
      this.code = number;
      this.description = description;
    }

    private int code;
    private String description;

    @Override
    public int getCode() {
      return 0;
    }

    @Override
    public String getDescription() {
      return null;
    }
  }

  enum Fruit implements INumberEnum {
    APPLE(0, " "),
    ORANGE(0, " "),
    BANANA(0, " ");

    Fruit(int number, String description) {
      this.code = number;
      this.description = description;
    }

    private int code;
    private String description;

    @Override
    public int getCode() {
      return 0;
    }

    @Override
    public String getDescription() {
      return null;
    }
  }
}

예: 클래스에서 enum 구성
이 예는 이전 예와 효과가 같다.

public class Plant2 {
  public enum Vegetable implements INumberEnum {...} //  
  public enum Fruit implements INumberEnum {...} //  
}
전략 매거
EffectiveJava에서는 정책 개요를 보여 줍니다.이런 매거는 매거를 끼워 넣는 방식을 통해 매거 상량을 분류 처리한다.
이런 방법은 비록 스위치 문장이 간결하지는 않지만 더욱 안전하고 유연하다.
예: EffectvieJava의 정책 개요 예

enum PayrollDay {
  MONDAY(PayType.WEEKDAY), TUESDAY(PayType.WEEKDAY), WEDNESDAY(
      PayType.WEEKDAY), THURSDAY(PayType.WEEKDAY), FRIDAY(PayType.WEEKDAY), SATURDAY(
      PayType.WEEKEND), SUNDAY(PayType.WEEKEND);

  private final PayType payType;

  PayrollDay(PayType payType) {
    this.payType = payType;
  }

  double pay(double hoursWorked, double payRate) {
    return payType.pay(hoursWorked, payRate);
  }

  //  
  private enum PayType {
    WEEKDAY {
      double overtimePay(double hours, double payRate) {
        return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT)
            * payRate / 2;
      }
    },
    WEEKEND {
      double overtimePay(double hours, double payRate) {
        return hours * payRate / 2;
      }
    };
    private static final int HOURS_PER_SHIFT = 8;

    abstract double overtimePay(double hrs, double payRate);

    double pay(double hoursWorked, double payRate) {
      double basePay = hoursWorked * payRate;
      return basePay + overtimePay(hoursWorked, payRate);
    }
  }
}

테스트

System.out.println(" 100 8 :" + PayrollDay.FRIDAY.pay(8.0, 100));
System.out.println(" 100 8 :" + PayrollDay.SATURDAY.pay(8.0, 100));
EnumSet 및 EnumMap
Java에는 EnumSet과 EnumMap 두 가지 도구가 있습니다.EnumSet 은 매거 유형의 고성능 Set으로 이루어진다.그것은 그것을 넣는 매거 상수가 반드시 같은 매거 유형에 속해야 한다고 요구한다.EnumMap 은 매거 유형을 위한 맵 구현입니다.HashMap과 같은 다른 Map을 사용해도 매거 유형의 실례를 매핑할 수 있지만 EnumMap을 사용하면 더욱 효율적이다. 같은 매거 유형의 실례만 키 값으로 받아들일 수 있고 매거 유형의 실례의 수량이 상대적으로 고정되고 제한되어 있기 때문에 EnumMap은 매거 유형에 대응하는 값을 저장하기 위해 수조를 사용한다.따라서 EnumMap의 효율성이 매우 높아집니다.

// EnumSet 
System.out.println("EnumSet ");
EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class);
for (ErrorCodeEn e : errSet) {
  System.out.println(e.name() + " : " + e.ordinal());
}

// EnumMap 
System.out.println("EnumMap ");
EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class);
errMap.put(StateMachine.Signal.RED, " ");
errMap.put(StateMachine.Signal.YELLOW, " ");
errMap.put(StateMachine.Signal.GREEN, " ");
for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) {
  Map.Entry<StateMachine.Signal, String> entry = iter.next();
  System.out.println(entry.getKey().name() + " : " + entry.getValue());
}

이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기