개념
enum 의 전체 이름은 열거이며 JDK 1.5에 도입 된 새로운 기능입니다.
Java에서 enum 키워드로 수정 된 유형은 열거 형입니다. 양식은 다음과 같습니다.
열거적인 색상 {빨간색, 녹색, 파란색}열거가 방법을 추가하지 않으면 열거 값 기본값은 0에서 시작하는 순서 값으로 기본적으로 표시됩니다. 예를 들어 색상 열거 유형을 취하면 열거 상수는 빨간색 : 0, Green : 1 및 Blue : 2 순서로됩니다.
열거의 이점 : 상수는 통일 된 방식으로 구성하고 관리 할 수 있습니다.
열거를위한 일반적인 응용 시나리오 : 오류 코드, 상태 머신 등
열거 유형의 특성
enum 실제로 새로운 데이터 유형처럼 보이지만 Enum은 제한된 클래스이며 자체 방법을 가지고 있습니다.
열거를 만들 때 컴파일러는 java.lang.Enum 에서 상속되는 관련 클래스를 생성합니다.
java.lang.Enum 클래스 선언
공개 초록 클래스 enum <e 확장 Enum <e >> 비슷한 <e>, Serializable {...}를 구현합니다.열거 방법
ENUM에서는 몇 가지 기본 방법이 제공됩니다.
values() : 열거 인스턴스 배열을 반환 하고이 배열의 요소는 Enum으로 선언 된 순서대로 엄격하게 유지됩니다.
name() : 인스턴스 이름을 반환합니다.
ordinal() : 인스턴스가 선언 될 때 0에서 시작하여 순서를 반환합니다.
getDeclaringClass() : 인스턴스가 속한 열거 유형을 반환합니다.
equals() : 동일한 객체인지를 결정합니다.
enum 인스턴스를 비교하기 위해 == 사용할 수 있습니다.
또한 java.lang.Enum Comparable 하고 Serializable 인터페이스를 구현하므로 비교 () 메소드도 제공됩니다.
예 : 열거적인 기본 방법
공개 클래스 ENUMMETHODDEMO {enum color {red, green, blue;} enum size {big, middle, small;} public static void main (string args []) {system.out.println ( "============== 모든 색상 인쇄 ============================================================= 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.getDeclaringClass ()); green.equals (color.green); }}산출
==================================== red cortinal : 0greenginal : 1Blue 서수 : 2 ============= 모든 크기 인쇄 ========================== 큰 순서 : 0MIDDLENTANINAL : 1SMAL NAME () : 2GREENE (2GREANE) getDeclaringClass () : class org.zp.javase.enumeration.enumdemo $ colorgreen hashcode () : 460141958green compareto color.green : 0green equals color.green : truegreen size.middle : false 1 : false = color.blue : false.
열거의 특징
열거의 특성은 한 문장으로 요약됩니다.
상속 할 수없는 것 외에도, enum 기본적으로 정규 계급으로 간주 될 수 있습니다.
그러나이 문장은 별도로 이해되어야합니다. 자세히 설명해 드리겠습니다.
열거는 방법을 추가 할 수 있습니다
개념 장에서 열거 값은 0에서 시작하는 순서 값으로 기본값을 기본적으로 기본적으로 표시됩니다. 질문은 다음과 같습니다.
Java는 Enum 상수에 값을 할당하는 것을 허용하지 않습니다 =
C/C ++에 노출 된 경우 자연스럽게 할당 기호 = 자연스럽게 생각할 것입니다. C/C ++ 언어에서, 열거는 할당 기호 = 표시된 열 상수에 할당 될 수있다. 그러나 불행히도, Java 구문에서는 열 상수에 할당 된 할당 기호 = 할당되지 않습니다.
예 : C/C ++ 언어로 열거 선언
typedef enum {1 = 1, 2, 3 = 3, 10 = 10} 숫자;Enum은 일반적인 방법, 정적 방법, 추상 방법 및 생성자 방법을 추가 할 수 있습니다.
Java는 인스턴스에 값을 직접 할당 할 수는 없지만 더 나은 솔루션이 있습니다. 디스플레이 할당을 간접적으로 구현하기 위해 열거에 메소드를 추가하십시오.
enum 만들 때 여러 가지 방법을 추가하고 생성자까지 추가 할 수도 있습니다.
참고 세부 사항 : 열거적인 방법을 정의하려면 열거의 마지막 인스턴스 끝에 세미콜론을 추가해야합니다. 또한, ENUM에서 인스턴스를 먼저 정의해야하며 인스턴스 전에 필드 또는 메소드를 정의 할 수 없습니다. 그렇지 않으면 컴파일러가 오류를보고합니다.
예 : 일반 방법, 정적 방법, 추상 방법 및 열거에서 방법을 구성하는 방법을 완전히 보여줍니다.
public enum errorcode {ok (0) {public string getDescription () {return "success"; }}, error_a (100) {public string getDescription () {return "error a"; }}, error_b (200) {public string getDescription () {return "error b"; }}; 개인 int 코드; // 생성자 : ENUM의 생성자는 개인 권한으로 만 선언 할 수 있거나 권한을 선언하지 않음 개인 ErrorCode (int 번호) {// 생성자 this.code = 숫자; } public int getCode () {// 일반 메소드 리턴 코드; } // 일반 메소드 public Abstract String getDescription (); // 초록 방법 public static void main (String args []) {// static method for (errorCode s : errorCode.Values ()) {system.out.println ( "code :" + s.getCode () + ", 설명 :" + s.getDescription ()); }}}참고 : 위의 예는 좋지 않으며, 열거가 다양한 방법의 정의를 지원한다는 것을 보여주기 위해서는 권장되지 않습니다. 다음은 단순화 된 예입니다
예 : 오류 코드 열거 유형의 정의
이 예제의 실행 결과와 위의 예는 정확히 동일합니다.
public enum errorcodeen {ok (0, "success"), error_a (100, "error a"), error_b (200, "error b"); ErrorCodeen (int 번호, 문자열 설명) {this.code = 숫자; this.description = 설명; } 개인 int 코드; 개인 문자열 설명; public int getCode () {반환 코드; } public String getDescription () {return description; } public static void main (String Args []) {// (ErrorCodeen S : ErrorCodeen.Values ()) {System.out.println ( "code :" + s.getCode () + ", 설명 :" + s.getDescription ()); }}}열거는 인터페이스를 구현할 수 있습니다
enum 일반 클래스와 같은 인터페이스를 구현할 수 있습니다.
또한 이전 섹션에서 오류 코드 열거 클래스를 구현합니다. 인터페이스를 구현하면 메소드를 제한 할 수 있습니다.
공개 인터페이스 InumberEnum {int getCode (); String getDescription ();} public enum errorcodeen2는 InberumberEnum {ok (0, "success"), error_a (100, "error a"), error_b (200, "error b"); ErrorCodeen2 (int 번호, 문자열 설명) {this.code = 숫자; this.description = 설명; } 개인 int 코드; 개인 문자열 설명; @override public int getCode () {return code; } @override public String getDescription () {return description; }}열거는 상속받을 수 없습니다
열거는 다른 클래스를 물려받을 수 없으며 물론 다른 열거를 물려받을 수는 없습니다.
enum 실제로 java.lang.Enum 클래스에서 상속되고 Java는 다중 상속을 지원하지 않기 때문에 Enum은 다른 클래스를 물려받을 수 없으며 물론 다른 enum 상속 할 수는 없습니다.
열거 된 응용 프로그램 시나리오
상수를 구성합니다
JDK1.5 이전에, Java에서 상수의 정의는 public static final TYPE a 였다; 이 형태로. 열거를 사용하면 코드를보다 읽기 쉽고 안전하게 만들기 위해 상수의 연관성을 구성하고 열거에 의해 제공된 방법을 사용할 수 있습니다.
열거 선언 형식
참고 : 열쇠에 정의 된 방법이 없으면 마지막 인스턴스 후에 쉼표, 세미콜론 또는 아무것도 추가 할 수도 있습니다.
다음 세 가지 선언 방법은 다음과 같습니다.
열거적인 색상 {빨간색, 녹색, 파란색} 열거적인 색상 {빨간색, 녹색, 파란색,} 열거적인 색상 {빨간색, 녹색, 파란색; }스위치 상태 머신
우리는 종종 스위치 문을 사용하여 상태 기계를 작성합니다. JDK7 후, 스위치는 int、char、String、enum 유형의 매개 변수를 지원했습니다. 이러한 유형의 매개 변수와 비교하여 열거를 사용하는 스위치 코드가 더 읽을 수 있습니다.
Enum Signal {빨간색, 노란색, 녹색} 공개 정적 문자열 getTrafficInstruct (신호 신호) {String instruct = "Signal Light Failure"; 스위치 (신호) {Case Red : 습스 = "빨간색 표시등 정지"; 부서지다; Case Yellow : 습스 = "노란색 빛에주의를 기울이십시오"; 부서지다; CASE GREEN : 습스 = "녹색 라이트 라인"; 부서지다; 기본값 : 브레이크; } return instruct;}열거를 조직하십시오
유사한 유형의 열거는 인터페이스 또는 클래스를 통해 구성 할 수 있습니다.
그러나 일반적으로 인터페이스에 의해 구성됩니다.
그 이유는 : Java 인터페이스는 컴파일 할 때 열거 유형에 public static 수정자를 자동으로 추가합니다. Java 클래스는 컴파일 할 때 enum 유형에 static 수정자를 자동으로 추가합니다. 차이를 보셨습니까? 맞습니다. 즉, 수업에서 열거 enum . public 으로 수정하지 않으면이 패키지에서만 액세스 할 수 있습니다.
예 : 인터페이스에서 열거를 구성합니다
공공 인터페이스 플랜트 {enum 야채는 inbumberenum {감자 (0, "감자"), 토마토 (0, "토마토"); 야채 (int 번호, 문자열 설명) {this.code = 숫자; this.description = 설명; } 개인 int 코드; 개인 문자열 설명; @override public int getCode () {return 0; } @override public String getDescription () {return null; }} enum 과일은 inumberenum {Apple (0, "Apple"), Orange (0, "Orange"), Banana (0, "Banana"); 과일 (int 번호, 문자열 설명) {this.code = 숫자; this.description = 설명; } 개인 int 코드; 개인 문자열 설명; @override public int getCode () {return 0; } @override public String getDescription () {return null; }}}예 : 수업에서 열거를 구성합니다
이 예제는 이전 예와 동일한 효과를 갖습니다.
Public Class Plant2 {public enum 야채 도구 InberberEnum {...} // 코드를 생략하여 Public Enum Fruit Amements Inumberenum {...} // 코드를 생략}전략 열거
전략의 열거는 효과적인 Java에 표시됩니다. 이 열거는 열거 된 중첩 열거에 의해 열거 상수를 분류합니다.
이 접근법은 스위치 문만큼 간결하지는 않지만 더 안전하고 유연합니다.
예 : Effectviejava의 정책 열거의 예
Enum Payrollday {월요일 (Paytype.weekday), 화요일 (Paytype.weekday), 수요일 (Paytype.weekday), 목요일 (Paytype.weekday), 금요일 (Paytype.weekday), 토요일 (Paytype.weekend), 일요일 (Paytype.weekend); 개인 최종 페이 타입 PayType; Payrollday (Paytype Paytype) {this.paytype = paytype; } Double Pay (Double Hoursworked, Double Payrate) {return paytype.pay (Hoursworked, Payrate); } // 정책 ENUM 개인 ENUM PAYTYPE {Weekday {Double OvertimePay (Double Hours, Double Payrate) {반환 시간 <= Houst_per_shift? 0 : (시간 -Houth_per_shift) * 급여 / 2; }}, 주말 {더블 오버 타임 핑 (이중 시간, 이중 급여) {반환 시간 * 급여 / 2; }}; 비공개 정적 최종 int 시간 _per_shift = 8; 초록 이중 오버 타임 팜 (이중 HRS, 이중 급여); 이중 급여 (이중 시간 소식, 이중 급여) {Double BasePay = Hoursworked * Payrate; 반품 BASEPAY + OVERTIMEPAY (HourSworked, Payrate); }}}시험
System.out.println ( "금요일에 8 시간 동안 시간당 임금을받는 사람들의 수입 :" + Payrollday.friday.pay (8.0, 100)); System.out.println ( "토요일에 8 시간 동안 시간당 임금을받는 사람들의 수입 :" + Payrollday.saturday.pay (8.0, 100));
열거 및 열거
Java는 ENUM을 작동하기에 편리한 두 가지 도구 클래스를 제공합니다.
EnumSet 열거 유형의 고성능 Set 구현입니다. 배치 된 열 상수는 동일한 열거 유형에 속해야합니다.
EnumMap 열거 유형에 맞게 조정 된 맵 구현입니다. 다른 Map 구현 (예 : HashMap)을 사용하면 열거 유형 인스턴스를 값 맵핑으로 완료 할 수 있지만, ENUMMAP를 사용하는 것이 더 효율적일 수 있지만, 열거 유형의 인스턴스 만 키 값과 만 수신 할 수 있으며, 열거 유형 인스턴스의 수는 비교적 고정되고 제한되어 있기 때문에 ENUMMAP는 어레이를 사용하여 ENUM 유형에 해당하는 값을 저장합니다. 이것은 열거적인 열거를 매우 효율적으로 만듭니다.
// enumset system.out.println ( "enumset display"); enumset <ErrorCodeen> errset = enumset.allof (ErrorCodeen.class); for (ErrorCodeen e : errset) {system.out.println (e.name () + ":" + e.odinal ());} // enummap system.out.println ( "enummap display"); enummap <statemachine.signal, string> errmap = new enummap (statemachine.signal.class); errmap.put (statemachine.signal.red, "red light"); errmap.put (statemachine.signal.yellow, "yellow"); errmap.put (statemachine.signal.green, "green light"); statemachine.signal. errmap.entryset (). iterator (); hasnext ();) {map.entry <statemachine.signal, string> entry = iter.next (); system.out.println (enther.getkey (). name () + ":" + enther.getValue ());}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.