알 아야 할 고급 JAVA 매 거 진 특성!
나 는 자바 에서 어떤 대상 의 잠재 치 를 표시 하기 위해 매 거 진 것 을 자주 발견 한다.
컴 파일 할 때 유형 이 어떤 값 을 가 질 수 있 는 지 확인 하 는 능력 은 강력 한 능력 으로 코드 에 구조 와 의 미 를 제공 합 니 다.
내 가 처음 매 거 진 것 을 알 았 을 때,나 는 그것들 이 상수 이름 을 위 한 도구 일 뿐,정적 상수 문자열 ENUM 에 의 해 쉽게 명 명 될 수 있다 고 생각 했다.VAL_NAME 대신
나중에 나 는 내 가 틀 렸 다 는 것 을 알 았 다.사실은 자바 매 거 진 이 상당히 고 급 스 러 운 특성 을 가지 고 코드 를 깨끗 하고 실수 하기 쉬 우 며 기능 이 강하 다 는 것 을 증명 한다.
자바 의 일부 고급 매 거 진 특성 과 이러한 특성 을 어떻게 이용 하여 코드 를 더욱 간단 하고 읽 을 수 있 는 지 살 펴 보 자.
매 거 는 종류 다!
자바 에 서 는 Object 의 하위 클래스 를 매 거 합 니 다.모든 기본 클래스,Enum 을 살 펴 보 자.
public abstract class Enum<E extends Enum<E>>
implements Constable, Comparable<E>, Serializable {
private final String name;
public final String name() {
return name;
}
private final int ordinal;
public final int ordinal() {
return ordinal;
}
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
public String toString() {
return name;
}
public final boolean equals(Object other) {
return this==other;
}
public final int hashCode() {
return super.hashCode();
}
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
}
우 리 는 이것 이 기본적으로 일반적인 추상 류 일 뿐 이 고 두 개의 필드,name 과 ordinal 이 있다 는 것 을 알 수 있다.그래서 매 거 는 모두 클래스 이기 때문에 일반적인 클래스 의 많은 특성 을 가지 고 있다.
우 리 는 매 거 에 실례 적 인 방법,구조 함수 와 필드 를 제공 할 수 있다.toString()을 다시 쓸 수 있 지만 hashCode()나 equals(Object other)를 다시 쓸 수 없습니다.
다음은 우리 의 매 거 진 예 를 살 펴 보 자.Operation.
enum Operation {
ADD,
SUBTRACT,
MULTIPLY
}
이 매 거 진 것 은 하나의 Operation 이 두 값 을 실행 할 수 있 고 하나의 결 과 를 생 성 할 수 있다 는 것 을 나타 낸다.이 기능 을 어떻게 실현 하 는 지 에 대해 최초의 생각 은 switch 문 구 를 사용 하 는 것 일 수 있 습 니 다.다음 과 같 습 니 다.
public int apply(Operation operation, int arg1, int arg2) {
switch(operation) {
case ADD:
return arg1 + arg2;
case SUBTRACT:
return arg1 - arg2;
case MULTIPLY:
return arg1 * arg2;
default:
throw new UnsupportedOperationException();
}
}
물론 이 정도 면 문제 가 있 을 수 있다.첫 번 째 문 제 는 우리 가 매 거 진 Operation 에 새로운 조작 을 추가 하면 컴 파일 러 는 이 스위치 가 새로운 조작 을 정확하게 처리 하지 못 한 다 는 것 을 알려 주지 않 는 다 는 것 이다.
더 나 쁜 것 은 게 으 른 개발 자가 다른 클래스 에서 이 코드 를 복사 하거나 다시 작성 하면 업데이트 할 수 없 을 수도 있다 는 것 이다.
두 번 째 문 제 는 기본 적 인 상황 default 입 니 다.모든 프로그램 에 필요 합 니 다.비록 정확 한 코드 에서 영원히 발생 하지 않 을 것 이라는 것 을 알 고 있 지만.
자바 컴 파일 러 가 위의 첫 번 째 문 제 를 알 고 있 으 며,우리 가 모 르 는 상태 에서 Operation 에 새로운 매 거 진 을 추가 할 수 있 도록 하기 때문이다.
다행히 자바 8 은 함수 식 프로 그래 밍 으로 우리 에 게 깨끗 한 해결 방안 을 제공 해 주 었 다.
함수 매 거 실현
매 거 진 클래스 이기 때문에 우 리 는 매 거 진 필드 를 만들어 서 작업 을 수행 하 는 함 수 를 저장 할 수 있 습 니 다.
그러나 우리 가 해결 방안 을 찾기 전에 재 구성 을 살 펴 보 자.
우선,우 리 는 스위치 를 enum 류 에 놓 습 니 다.
enum Operation {
ADD,
SUBTRACT,
MULTIPLY;
public static int apply(Operation operation, int arg1, int arg2) {
switch(operation) {
case ADD:
return arg1 + arg2;
case SUBTRACT:
return arg1 - arg2;
case MULTIPLY:
return arg1 * arg2;
default:
throw new UnsupportedOperationException();
}
}
}
우 리 는 이렇게 할 수 있다.Operation.apply(Operation.ADD,2,3);우 리 는 현재 Operation 에서 방법 을 호출 하고 있 기 때문에 이 를 인 스 턴 스 방법 으로 변경 하고 이 를 사용 할 수 있 습 니 다.Operation.apply()로 실현 하 는 것 이 아니 라 다음 과 같 습 니 다.
public int apply(int arg1, int arg2) {
switch(this) {
case ADD:
return arg1 + arg2;
case SUBTRACT:
return arg1 - arg2;
case MULTIPLY:
return arg1 * arg2;
default:
throw new UnsupportedOperationException();
}
}
이렇게 사용:Operation.ADD.apply(2,3);좋아 진 것 같 아.이제 함수 식 프로 그래 밍 을 통 해 switch 문 구 를 완전히 제거 합 니 다.
enum Operation {
ADD((x, y) -> x + y),
SUBTRACT((x, y) -> x - y),
MULTIPLY((x, y) -> x * y);
Operation(BiFunction<Integer, Integer, Integer> operation) {
this.operation = operation;
}
private final BiFunction<Integer, Integer, Integer> operation;
public int apply(int x, int y) {
return operation.apply(x, y);
}
}
여기 서 내 가 한 것 은:우리 의 예 에서 두 매개 변 수 는 모두 int 형 이 고 반환 값 도 int 형 입 니 다.불 행 히 도 자바 매개 변수 화 형식 은 원 어 를 지원 하지 않 기 때문에 Integer 를 사용 해 야 합 니 다.
BiFunction 은@functioninterface 로 주석 을 달 았 기 때문에 람 다 표현 법 으로 하 나 를 정의 할 수 있 습 니 다.
우리 의 함수 가 두 개의 인 자 를 받 아들 이기 때문에 우 리 는(x,y)를 사용 하여 그것들 을 지정 할 수 있다.
그리고 우 리 는 한 줄 의 방법 을 정 의 했 습 니 다.그것 은->x+y 를 사용 하여 값 을 되 돌려 줍 니 다.이것 은 아래 의 방법 에 해당 하 는데,단지 더욱 간결 할 뿐이다.
class Adder implements BiFunction<Integer, Integer, Integer> {
@Override
public Integer apply(Integer x, Integer y) {
return x + y;
}
}
우리 의 새로운 Operation 실현 은 같은 방식 을 사용한다.Operation.ADD.apply(2,3).그러나 이런 실현 은 더욱 좋다.왜냐하면 컴 파 일 러 는 우리 에 게 언제 새로운 Operation 을 추 가 했 는 지 알려 주기 때문에 이것 은 우리 에 게 새로운 함 수 를 갱신 하 라 고 요구 하기 때문이다.만약 이 점 이 없다 면,우리 가 새로운 Operation 을 추가 할 때 switch 문 구 를 업데이트 하 는 것 을 기억 하지 못 한다 면,Unsupported Operation Exception()을 받 을 수 있 습 니 다.
관건
본문 참고:https://medium.com/javarevisited/advanced-java-enum-features-you-need-to-know-b516a191c7e2
이상 은 반드시 알 아야 할 고급 JAVA 매 거 진 특성 입 니 다!의 상세 한 내용,더 많은 고급 JAVA 매 거 진 특성 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.