JAVA 의 매 거 진 (2)

지금까지 저 희 는 가장 간단 한 문법 으로 매 거 진 유형 만 정 의 했 습 니 다. 사실은 매 거 진 유형 은 더 많은 일 을 할 수 있 습 니 다. Tiger 의 정의 에서 매 거 진 것 은 새로운 유형 입 니 다. 상수 로 특정한 데이터 세 션 을 표시 할 수 있 고 일반 유형의 대부분 기능 을 수행 할 수 있 습 니 다. 예 를 들 어 자신의 구조 함수, 방법, 속성 등 을 정의 할 수 있 습 니 다.이것 도 자바 와 C / C + + 또는 Pascal 의 다른 부분 입 니 다. 그 두 가지 언어 에서 매 거 진 유형 은 int 형식의 숫자 를 대표 하지만 자바 에서 매 거 진 것 은 하나의 유형 과 같 습 니 다.
    이어서 우 리 는 우리 의 매 거 진 유형 을 풍부하게 할 것 이다.
 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

좋은 웹페이지 즐겨찾기