알 아야 할 고급 JAVA 매 거 진 특성!

6875 단어 자바매 거특성
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);
       }
 
 }
여기 서 내 가 한 것 은:
  • 필드 BiFunctionoperation
  • 추가
  • BiFunction 으로 Operation 에 사용 할 구조 함 수 를 만 들 었 습 니 다.
  • 매 거 진 정의 의 구조 함 수 를 호출 하고 lambda 로 BiFunction를 지정 합 니 다.
  • 이 java.util.function.BiFunction operation 필드 는 두 개의 매개 변 수 를 사용 하 는 함수(방법)에 대한 참조 입 니 다.
    우리 의 예 에서 두 매개 변 수 는 모두 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()을 받 을 수 있 습 니 다.
    관건
  • Enum 은 Enum 의 확장 클래스 입 니 다.
  • Enum 은 필드,구조 함수 와 인 스 턴 스 방법 이 있 습 니 다.
  • Enum 매 거 진 필드 는 함 수 를 저장 할 수 있 습 니 다.lambdas 와 함께 사용 하면 깨끗 하고 안전 한 특정한 함 수 를 만 들 수 있 으 며,컴 파일 할 때 switch 대신 강제 실행 할 수 있 습 니 다.
  • 다음은 이 예제 의 GitHub 주소 입 니 다.https://github.com/alex-power/java-enum-example
    본문 참고:https://medium.com/javarevisited/advanced-java-enum-features-you-need-to-know-b516a191c7e2
    이상 은 반드시 알 아야 할 고급 JAVA 매 거 진 특성 입 니 다!의 상세 한 내용,더 많은 고급 JAVA 매 거 진 특성 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기