JAVA 의 매 거 진 (2)
이어서 우 리 는 우리 의 매 거 진 유형 을 풍부하게 할 것 이다.
5 개의 근무일 을 포함 하 는 매 거 진 유형 을 정의 하 였 으 나, 실제 근무일 마다 작업 하 는 동작 은 다른 종류의 printWeekDay 방법 에서 이 루어 집 니 다.만약 에 우리 가 분석 을 통 해 근무일 에 대한 조작 이 매 거 유형 WeekDay 의 직책 에 속 해 야 한 다 는 것 을 발견 하면 우 리 는 매 거 유형 을 다음 과 같이 개조 할 수 있다.
public enum WeekDay {
MONDAY, TUESDAY, WENSDAY, THURSDAY, FRIDAY;
/**
* 。
*/
public void printWeekDay(){
switch(this){
case MONDAY:
System.out.println(“Today is Monday!”);
break;
case TUESDAY:
System.out.println(“Today is Tuesday!”);
break;
case WENSDAY:
System.out.println(“Today is Wensday!”);
break;
case THURSDAY:
System.out.println(“Today is Thursday!”);
break;
case FRIDAY:
System.out.println(“Today is Friday!”);
break;
default:
throw new AssertionError("Unexpected value: " + this);
}
}
}
//
for(WeekDay weekDay: EnumSet.allOf(WeekDay.class)){
System.out.println("the message is : "+weekDay.printWeekDay());
}
현재 매 거 진 타 입 Operation 이 풍만 해 졌 습 니 다. 매 거 진 타 입 WeekDay 에 printWeekDay 방법 을 추 가 했 습 니 다. WeekDay. MONDAY. printWeekDay () 방법 으로 정 보 를 출력 할 수 있 습 니 다.
매 거 진 형식 도 자신의 구조 함 수 를 정의 할 수 있 기 때문에 매 거 진 상수 가 더 많은 정 보 를 초기 화 할 수 있 습 니 다.EnumMap 과 EnumSet 에서 언급 한 매 거 진 형식 DataBaseType 을 보십시오. 현재 지원 하 는 모든 데이터베이스 형식 을 저장 합 니 다.그러나 이것 은 하나의 '코드' 일 뿐 데이터 베이스 와 관련 된 정 보 는 한 응용 프로그램 에 있어 고정 적 으로 변 하지 않 기 때문에 이 데 이 터 를 매 거 진 유형 자체 에 배치 하 는 것 이 디자인 습관 에 더욱 부합된다.
public enum DataBaseType{
MySQL("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/mydb"),
Oracle("oracle.jdbc.driver.OracleDriver",
"jdbc:oracle:thin:@localhost:1521:sample"),
DB2("com.ibm.db2.jdbc.app.DB2Driver",
"jdbc:db2://localhost:5000/sample"),
SQLSERVER("com.microsoft.jdbc.sqlserver.SQLServerDriver",
"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb");
private String driver;
private String url;
// , 、URL
DataBaseType(String driver,String url){
this.driver = driver;
this.url = url;
}
/**
*
* @return
*/
public String getDriver() {
return driver;
}
/**
* URL
* @return
*/
public String getUrl() {
return url;
}
}
//
for(DataBaseType dataBaseType: EnumSet.allOf(DataBaseType.class)){
System.out.println("the driver is : "+dataBaseType.getDriver());
System.out.println("the url is : "+dataBaseType.getUrl());
}
당신 은 예 에서 매 거 진 상수 가 사용자 정의 구조 함 수 를 사용 하여 초기 화 하 는 것 을 어떻게 설명 하 는 지 알 고 있 습 니까?초기 화 에 사용 할 데 이 터 를 매 거 진 상수 이름 뒤의 괄호 에 넣 으 면 됩 니 다.
현재 우 리 는 두 가지 내용 이 풍부 한 매 거 유형 을 디자인 하여 매 거 유형 에 대한 사용 도 자 연 스 러 워 졌 다.너 는 매 거 유형 과 유형 간 의 차이 가 매우 적다 고 생각 할 지도 모른다.그러나 매 거 유형 은 여러 가지 제한 이 있 기 때문에 자신의 매 거 유형 을 실현 할 때 반드시 따라 야 한다.
주의:
1. 매 거 진 형식 은 extends 키 워드 를 사용 할 수 없 지만 implements 키 워드 를 사용 할 수 있 습 니 다.이렇게 하면 우 리 는 서로 다른 매 거 유형 이 공유 하 는 행 위 를 인터페이스 에 추출 하여 매 거 유형의 행 위 를 규범화 시 킬 수 있다.
2. 매 거 진 형식의 사용자 정의 구조 함 수 는 기본 으로 실 행 된 구조 함 수 를 덮어 쓸 수 없습니다. 기본 구조 함수 에 따라 실 행 됩 니 다.
3. 매 거 진 유형의 사용자 정의 구조 함 수 는 반드시 개인 적 이 어야 합 니 다.구조 함수 에 private 키 워드 를 추가 할 필요 가 없습니다. 컴 파일 러 가 대신 해 줄 것 입 니 다.
4. 매 거 진 유형 에서 매 거 진 상수 의 정 의 는 맨 위 에 놓 아야 변수 와 방법의 정의 가 될 수 있다.
템 플 릿 방법 으로 이 화 제 를 이야기 하기 전에 우 리 는 고 쳐 쓴 print WeekDay 방법 을 살 펴 봐 야 한다. 그 예 에서 WeekDay 는 좀 풍부 해 졌 지만 switch 를 사용 하여 매 거 진 상수 에 대해 하나씩 판단 하여 서로 다른 행 위 를 맞 추고 확장 하 는 것 이 번 거 로 웠 다.WeekDay 에 새 상수 가 추가 되 었 다 면 switch 에 해당 하 는 case 표 시 를 추가 하 는 것 을 잊 었 다 면 default 표시 가 있어 도 실행 후에 만 발견 할 수 있 습 니 다.
어떻게 하면 더 좋 을 까?우 리 는 앞에서 매 거 진 것 이 하나의 특수 한 유형 이라는 것 을 깨 달 았 다. 그것 은 방법 과 속성 을 가 질 수 있 고 모든 성명 의 매 거 진 항목 은 이 매 거 진 유형의 인 스 턴 스 이다.그러면 우 리 는 '템 플 릿 방법 모델' 을 사용 하여 이 매 거 진 종 류 를 개조 할 수 있 습 니까?그럼요!우 리 는 그 예 를 재 구성 해서 아래 의 이렇게 만 들 었 다.
public enum WeekDay {
MONDAY{
@Override
public void printWeekDay() {
System.out.println(“Today is Monday!”);
}
},
TUESDAY{
@Override
public void printWeekDay() {
System.out.println(“Today is Tuesday!”);
}
},
WENSDAY{
@Override
public void printWeekDay() {
System.out.println(“Today is Wensday!”);
}
},
THURSDAY{
@Override
public void printWeekDay() {
System.out.println(“Today is Thursday!”);
}
},
FRIDAY{
@Override
public void printWeekDay() {
System.out.println(“Today is Friday!”);
}
};
/**
*
*/
public abstract void printWeekDay();
}
우선, 우 리 는 방법 print WeekDay 를 추상 적 인 방법 으로 바 꾼 다음 에 우 리 는 매 거 진 상수 에서 매 거 진 유형 에서 정 의 된 이 추상 적 인 방법 을 실현 했다.이렇게 하면 매 거 진 유형 에 새로운 매 거 진 상수 를 추가 할 때마다 매 거 진 유형 에서 정 의 된 추상 적 인 방법 을 실현 해 야 한다. 그렇지 않 으 면 컴 파일 러 가 오 류 를 제시 해 야 한다.이렇게 할 수 있 는 이 유 는 가상 컴퓨터 가 매 거 진 유형 에서 설명 하 는 모든 매 거 진 상수 들 을 하나의 단독 매 거 진 유형의 하위 클래스 로 만 들 기 때문이다.
이렇게 해서 Tiger 의 정적 가 져 오기 에 맞 춰 호출 자의 코드 를 이렇게 쓸 수 있 습 니 다.
MONDAY.printWeekDay();
TUESDAY.printWeekDay();
//or better...
getWeekDay().printWeekDay();
이 코드 들 은 흔히 볼 수 있 는 if (week Day = = WeekDay. MONDAY) {...} else if (week Day = = WeekDay. TUESDAY) else {...} 보다 형식 이 훨씬 강 합 니 다. 읽 기 쉽 고 확장 되 며 유지 하기 쉽 습 니 다.
앞에서 말 한 바 와 같이 구조 함 수 를 사용자 정의 할 수 있 고 속성 으로 더 많은 데 이 터 를 연결 할 수 있 습 니 다.그럼 우리 에 게 이런 필요 가 있다 면 어떻게 해 야 하나 요?우 리 는 관련 데이터 에 근거 하여 상응하는 매 거 진 항목 을 얻어 야 한다. 예 를 들 어 다음 과 같은 상황 이다.
public final enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
}
여기 서 각 Status 는 하나의 code 에 대응 하고 WAITING 은 0 에 대응 하 며 COMPLETED 는 5 에 대응 합 니 다.0 을 통 해 WAITING 이라는 매 거 진 을 얻 으 려 면 어떻게 해 야 합 니까?
방법 도 간단 합 니 다. 정적 인 자바 util. Map 을 사용 하여 code 와 매 거 진 항목 을 연결 하면 됩 니 다. 이렇게:
public final enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private static final Map lookup
= new HashMap();
static {
for(Status s : EnumSet.allOf(Status.class)){
lookup.put(s.getCode(), s);
}
}
public static Status get(int code) {
return lookup.get(code);
}
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
}
정적 방법 get (int) 은 필요 한 역방향 검색 능력 을 제공 합 니 다. 정적 블록 에 EnumSet 을 사용 하여 맵 을 사용 하 는 Map 을 조립 합 니 다. Over!
결론: 매 거 진 을 사용 하지만 남용 하지 마 세 요!
새로운 언어 를 배 울 위험 중 하 나 는 새로운 문법 구 조 를 미 친 듯 이 사용 하 는 것 이다.만약 이렇게 한다 면, 당신 의 코드 는 갑자기 80% 가 범 형, 레이 블, 매 거 될 것 입 니 다.따라서 매 거 진 곳 에 만 사용 해 야 한다.그렇다면 매 거 진 것 은 어디 에 적용 되 나 요?일반적인 규칙 은 현재 switch 코드 로 상수 로 전환 하 는 모든 곳 을 상수 로 사용 하 는 것 이다.단 하나의 값 (예 를 들 어 신발 의 최대 사이즈 나 우리 에 원숭이 를 담 을 수 있 는 최대 수량) 만 있다 면 이 임 무 를 상수 에 남 겨 두 는 것 이 좋 겠 다.그러나 한 그룹의 값 을 정의 하면 이 값 중 어느 것 이 든 특정한 데이터 형식 에 사용 할 수 있다 면 이 곳 에 매 거 진 것 이 가장 적합 하 다.
다음으로 전송:http://blog.csdn.net/shimiso/article/details/5909239
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PEB 의 Ldr 를 통 해 프로 세 스 에 불 러 온 모든 모듈 을 열거 합 니 다.1. 몇 가지 중요 한 데이터 구 조 는 windbg 의 dt 명령 을 통 해 상세 한 정 보 를 볼 수 있 습 니 다. _PEB、_PEB_LDR_DATA、_LDR_DATA_TABLE_ENTRY 2. 기술 원리 1....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.