자바 매 거 진: 작은 enum, 우아 하고 깨끗 합 니 다.

자바 매 거 진: 작은 enum, 우아 하고 깨끗 합 니 다.
'자바 프로 그래 밍 사상' 에는 "때로는 그것 때문에 '우아 하고 깨끗하게' 문 제 를 해결 할 수 있 을 때 가 있다" 는 말 이 있다. 이 말 은 누구 일 까?바로 이 편의 주인공 인 매 거 (Enum) 입 니 다. 모두 박 수 를 쳤 습 니 다.
오랫동안 나 는 매 거 진 것 을 별로 사용 하지 않 았 다. 왜냐하면 그것 은 쓸모 가 없다 고 느 꼈 기 때문이다. 이것 이 바로 '자기 인지' 의 짧 은 견해 이기 때문이다.한 사람 이 자신의 깊 은 우물 에 쭈 그리고 앉 아 감히 튀 어 나 오지 못 한다 면, 그 는 정말 우물 입구 만큼 큰 하늘 만 볼 수 있 을 것 이다.
시간 이 지 날수 록 제 가 하 는 프로젝트 가 점점 많아 지고 매 거 진 만 남 의 기회 도 많아 졌 습 니 다. 그래서 저 는 점점 그것 에 관심 이 많아 지고 연 구 를 많이 해서 원래 매 거 진 것 이 이렇게 우수 하 다 는 것 을 알 게 되 었 습 니 다.
1) 매 거 진 일반적인 용법
아주 깔끔 하고 우아 한 간단 한 매 거 진
public enum Chenmo {
       
    WANGER, WANGSAN, WANGSI
}

우 리 는 침묵 을 위해 각각 세 개의 값 을 만 들 었 는데, 각각 왕 2, 왕 3, 왕 4 이다.이 코드 는 실제로 세 번 Enum(String name, int ordinal) (ordinal 단어의 뜻 은 순서) 호출 되 었 습 니 다. 즉,:
new Enum("WANGER"0);
new Enum("WANGSAN"1);
new Enum("WANGSI"2);

우 리 는 매 거 진 출력 을 옮 겨 다 녔 다.
for (Chenmo e : Chenmo.values()) {
      
    System.out.println(e);
}
//
//WANGER
//WANGSAN
//WANGSI

2) switch 의 판단 조건 으로
switch 구문 으로 매 거 진 판단 조건 을 사용 하면 코드 의 가 독성 을 더욱 강하 게 할 수 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
Chenmo key = Chenmo.WANGER;
switch (key) {
case WANGSI:
    System.out.println(" CSDN ");
    break;
case WANGSAN:
    System.out.println(" CSDN ");
    break;
default:
    System.out.println(" , ");
    break;
}

케이스 키 워드 를 통 해 판단 할 때 매 거 진 값 을 직접 사용 할 수 있어 간결 합 니 다.또한 컴 파일 기간 에 유형 을 제한 하면 경 계 를 넘 는 상황 을 효과적으로 피 할 수 있 습 니 다. 문자열 상수 유형 은 switch 판단 조건 으로 할 때 오 작 으로 인해 경 계 를 넘 는 문제 가 발생 하기 쉽 습 니 다.
3) 매 거 실현 사례
라 는 책 에서 매 거 진 실현 사례 를 사용 하 는 방식 에 대해 다음 과 같이 추앙 한다.
매 거 진 사례 를 실현 하 는 방법 을 사용 하 는 것 은 아직 광범 위 하 게 사용 되 지 않 았 지만 단일 요소 의 매 거 진 유형 은 이미 싱글 톤 을 실현 하 는 가장 좋 은 방법 이 되 었 다.
나 는 '아직 광범 위 하 게 사용 되 지 는 않 았 지만' 라 는 몇 글 자 를 지 울 수 있다 고 생각한다. 지금까지 모두 가 알 고 있 을 것 이다. 매 거 진 실현 사례 를 사용 하 는 것 은 매우 좋 은 방식 이다.
먼저 '이중 검사 자물쇠' 가 실 현 된 단 례 를 보십시오.
public class SingleTon2 {
         

     // 
    private SingleTon2() {
    };

    private static volatile SingleTon2 singleTon = null;

    public static SingleTon2 getInstance() {

        // 
        if (singleTon == null) {
            synchronized (SingleTon2.class) {
                // 
                if (singleTon == null) {
                    singleTon = new SingleTon2();
                }
            }
        }
        return singleTon;
    }
}

다시 매 거 진 실현 사례 를 살 펴 보 자.
public enum SingleTon {
       

     INSTANCE;

    public void method() {
        System.out.println(" !");
    }
}

모 르 는 것 보다 못 하 다 니, 깜짝 이 야!매 거 방식 의 단일 예 는 폭발 할 정도 로 간단 하 다. 너무 간소화 해 보이 지 않도록 나 는 '나 는 즐겁다' 는 출력 방법 도 추가 했다.
매 거 진 실현 사례 는 두 가지 문 제 를 쉽게 해결 할 수 있다.
① 라인 안전 문제.자바 가상 머 신 은 매 거 진 종 류 를 불 러 올 때 ClassLoader 의 loadClass 방법 을 사용 하기 때문에 이 방법 은 동기 코드 블록 을 사용 하여 스 레 드 안전 을 확보 합 니 다.
② 반 직렬 화 파괴 사례 를 피한다.매 거 진 반 서열 화 는 반 사 를 통 해 이 루어 지지 않 기 때문이다.
4) 매 거 진 데이터베이스 와 상호작용 가능
Mybatis 에 맞 춰 데이터베이스 필드 를 매 거 진 형식 으로 변환 할 수 있 습 니 다.현재 데이터베이스 필드 check 가 있다 고 가정 합 니 다.type 의 종 류 는 다음 과 같 습 니 다.
`check_type` int(1) DEFAULT NULL COMMENT '    (1:   、2:  )',

이것 에 대응 하 는 매 거 진 형식 은 Check Type 입 니 다. 코드 는 다음 과 같 습 니 다.
public enum CheckType {
       
    NO_PASS(0" "), PASS(1" ");
    private int key;

    private String text;

    private CheckType(int key, String text) {
        this.key = key;
        this.text = text;
    }

    public int getKey() {
        return key;
    }

    public String getText() {
        return text;
    }

    private static HashMap map = new HashMap();
    static {
        for(CheckType d : CheckType.values()){
            map.put(d.key, d);
        }
    }

    public static CheckType parse(Integer index) {
        if(map.containsKey(index)){
            return map.get(index);
        }
        return null;
    }
}

Check Type 매 거 진 클래스 는 우리 가 처음 본 그 Chenmo 매 거 진 클래스 보다 좀 복잡 하 다.
첫째, CheckType 은 구조 방법 을 새로 추 가 했 고 두 필드 가 있 습 니 다. key 는 int 형 이 고 text 는 String 형 입 니 다.
둘째, Check Type 에는 하나의 Integer 를 key 의 매 칭 을 통 해 매 거 진 형식 으로 바 꿀 수 있 는 public static CheckType parse(Integer index) 방법 이 있 습 니 다.
이제 Mybatis 설정 파일 에서 데이터베이스 필드 를 매 거 진 형식 으로 바 꿀 수 있 습 니 다.
<resultMap id="CheckLog" type="com.entity.CheckLog">
  <id property="id" column="id"/>
  <result property="checkType" column="check_type" typeHandler="com.CheckTypeHandler">result>
resultMap>

그 중에서 checkType 필드 에 대응 하 는 종 류 는 다음 과 같 습 니 다.
public class CheckLog implements Serializable { 

    private String id;
    private CheckType checkType;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public CheckType getCheckType() {
        return checkType;
    }

    public void setCheckType(CheckType checkType) {
        this.checkType = checkType;
    }
}

CheckTypeHandler 변환기 의 원본 코드 는 다음 과 같 습 니 다.
public class CheckTypeHandler extends BaseTypeHandler<CheckType{ 

    @Override
    public CheckType getNullableResult(ResultSet rs, String index) throws SQLException {
        return CheckType.parse(rs.getInt(index));
    }

    @Override
    public CheckType getNullableResult(ResultSet rs, int index) throws SQLException {
        return CheckType.parse(rs.getInt(index));
    }

    @Override
    public CheckType getNullableResult(CallableStatement cs, int index) throws SQLException {
        return CheckType.parse(cs.getInt(index));
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int index, CheckType val, JdbcType arg3) throws SQLException {
        ps.setInt(index, val.getKey());
    }
}

CheckTypeHandler 의 핵심 기능 은 CheckType 매 거 진 typeHandler 방법 으로 데이터베이스 필드 를 변환 하 는 것 이다.
5) 매 거 진 것 이 정적 상수 보다 메모 리 를 더 소모 합 니까?
가장 많이 사용 되 는 네 가지 지식 을 말 한 후에 우 리 는 '매 거 진 것 이 정적 상수 보다 메모 리 를 더 소모 할 수 있 습 니까?' 라 는 화 제 를 토론 합 니 다. 이런 질문 을 하 는 사람 이 있 고 많은 사람들 이 대답 에 참여 하 는 것 을 알 고 있 습 니 다.
내 가 이해 하 는 바 에 의 하면 이 문 제 를 묻 는 사람 은 마치 '0.000, 001' 이 '0.000, 000, 99' 보다 크 냐 고 묻 는 것 같다.그렇다 고요?
주소https://www.cnblogs.com/qing-gee/p/10455969.html

좋은 웹페이지 즐겨찾기