자바 가 제공 하 는 enum 상세 설명

7787 단어 자바
오늘 첫날 < < Effective Java > > 를 보고 6 장의 첫 번 째 조 는 책의 30 조 인 int 상수 대신 enum 을 사용 하 는 것 입 니 다.
1. enum 도 class 처럼 멤버 함 수 를 가 질 수 있다 는 것 을 처음 알 았 다.사 칙 연산 의 예 를 들다.
package com.wjy.test;

public enum Operation {
    PLUS,MINUS,TIMES,DIVIDE;
    double apply(double x,double y){
        switch(this){
        case PLUS:    return x+y;
        case MINUS:    return x-y;
        case TIMES:    return x*y;
        case DIVIDE: return x/y;
        }
        throw new AssertionError("Unknown op: "+this);
    }
}

호출 코드:
package com.wjy.test;
public class Test {
    public static void main(String args[]){
    System.out.println(Operation.PLUS.apply(1.0,2.2));
    }
}

 
그러나 이 같은 방식 은 확장 에 불리 하 다 는 점 이 문제 다.새로운 매 거 진 상수 가 추가 되 고 switch 가 문 구 를 추가 하려 면 이 모드 는 매우 취약 합 니 다.
서로 다른 행 위 를 모든 상수 와 연결 시 킬 수 있 는 좋 은 모델 이 있다.
2. 서로 다른 행 위 를 모든 상수 와 관련 시 키 는 방법:
package com.wjy.test;

public enum Operation {
    PLUS{    double apply(double x,double y){return x+y;}    },
    MINUS{    double apply(double x,double y){return x-y;}    },
    TIMES{    double apply(double x,double y){return x*y;}    },
    DIVIDE{    double apply(double x,double y){return x/y;}    };
    
    abstract double apply(double x,double y);
    }

호출 코드
package com.wjy.test;
public class Test {
    public static void main(String args[]){
    System.out.println(Operation.PLUS);
    System.out.println(Operation.PLUS.apply(1.0,2.2));
    }
}

실행 결과:
//  
PLUS
3.2

문제 가 또 생 겼 다. 왜 '+' 가 아 닌 'PLUS' 를 출력 하 는 지,' + '를 출력 하 게 하기 위해 서 는 toString 방법 을 덮어 써 야 하 는 지.
3. toString 을 다시 불 러 옵 니 다 ()
package com.wjy.test;

public enum Operation {
    PLUS("+"){    double apply(double x,double y){return x+y;}    },
    MINUS("-"){    double apply(double x,double y){return x-y;}    },
    TIMES("*"){    double apply(double x,double y){return x*y;}    },
    DIVIDE("/"){    double apply(double x,double y){return x/y;}    };
    
    private final String symbol;
    Operation(String symbol) {
    this.symbol=symbol;
    }
    @Override 
    public String toString(){
        return symbol;
    }
    abstract double apply(double x,double y);
    }

Option. PLUS 와 "+" 가 연결 되 어 있 습 니 다.

좋은 웹페이지 즐겨찾기