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.Enum
은 Comparable
과 Serializable
인터페이스를 실현했으므로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 및 EnumMapJava에는 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());
}
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.