자바 매 거 진: 작은 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx websocket ip_해시 규칙프로젝트 를 다운로드 한 후 서로 다른 네트워크 에 각각 이 demo 프로젝트 를 배치 합 니 다. 프로젝트 에서 환경 변수 에 따라 시스템 변 수 를 설정 합 니 다. spring.profiles.active=de...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.