Think In Java 19 장 매 거 유형

8879 단어
본 고 는 KuTear 's Blog 에 발표 되 었 으 니, 전재 하 시 겠 습 니까?
  • 기본적으로 Enum 류 에 계승 합 니 다. Java 의 단일 계승 체제 로 인해 다른 종류 로 계승 할 수 없습니다.
  • 매 거 진 요 소 는 실질 적 으로 클래스 의 정적 상수 역 이다.
    public class EnumTest {
        enum Test {
            TEST_1("1"), TEST_2("2");
            private String descript;
            Test(String descript) {
                this.descript = descript;
            }
        }
    }
    
    이 매 거 진 은 역 컴 파일 을 통 해 내부 javap EnumTest$Test.class 를 살 펴 본다. 또한 매 거 진 종 류 는 final 이 고 하위 클래스
    Compiled from "EnumTest.java"
    final class EnumTest$Test extends java.lang.Enum {
        public static final EnumTest$Test TEST_1;
        public static final EnumTest$Test TEST_2;
        public static EnumTest$Test[] values();
        public static EnumTest$Test valueOf(java.lang.String);
        static {};
    }
    
  • 가 없 을 것 이다.
  • 구조 함수 에 대해 사용자 가 자체 적 으로 예화 하 는 것 을 허락 하지 않 기 때문에 구조 기 는 privatepublic 모두 같다.
  • 정적 가 져 오기, 위의 예 와 같이. 다른 곳 에서 사용 하면 정적 가 져 오기
    import static EnumTest.Test.*
    
  • 를 사용 할 수 있 습 니 다.
  • Javaswitch 자구 지원 유형
  • short(Short)
  • char(Charactor)
  • byte(Byte)
  • int(Integer)
  • String
  • enum

  • 자바 7 에 도 입 된 String 는 본질 적 으로 int 를 사용 하여 판단 하 는 hashCode()equals()
  • 매 거 진 values() 정적 함 수 는 컴 파일 러 가 기록 한 것 입 니 다. 위로 Enum 로 전환 한 후 잃 어 버 렸 습 니 다. ClassgetEnumContants() 를 통 해 매 거 진 요 소 를 얻 을 수 있 습 니 다.
  • 추상 적 인 방법 을 매 거 진 실현
    enum FontConstant{
          Blod{
              @Override
              void show() {
                 //TODO
              }
          },
          Italilc{
              @Override
              void show() {
                 //TODO
              }
          },
          Plain{
              @Override
              void show() {
                 //TODO
              }
          };
          abstract void show();
    }
    
  • EnumSetEnumMap 의 사용
  • EnumSet 내부 데이터 의 순 서 는 add(...) 시의 순서 와 관계 가 없 으 며 enum 에서 밝 힌 순서 와 일치 합 니 다.
  • public static void showEnumSet(){
          EnumSet enumSet = EnumSet.noneOf(FontConstant.class);
          enumSet.add(FontConstant.Blod);
          enumSet.add(FontConstant.Plain);
          enumSet.add(FontConstant.Italilc);
          enumSet.add(FontConstant.Blod);
          for(Iterator iter = enumSet.iterator(); iter.hasNext();){
              System.out.println(iter.next());
          }
    }
    
    출력:
    Blod Italilc Plain
    이 를 통 해 알 수 있 듯 이 EnumSet 의 순 서 는 enum 의 성명 과 관련 되 고 중복 되 지 않 는 대상 만 추가 할 수 있다.
  • EnumMap EnumMapEnumSet 의 순 서 는 같다.
  • 매 거 진 책임 체인 은 의존 과 매 거 진 순서
    enum Handler {
         HANDLER_1 {
             @Override
             boolean handler(Action action) {
                 return action.action == 1;
             }
         },
         HANDLER_2 {
             @Override
             boolean handler(Action action) {
                 return action.action == 2;
             }
         };
    
         abstract boolean handler(Action action);
    }
    
    public static class Action{
         int action;
    
         public Action(int action) {
             this.action = action;
         }
    }
    
    public static void handler(Action action) {
         for (Handler handler : Handler.values()) {
             if (handler.handler(action)) {
                 System.out.println(handler.name() + " Handle This Action");
                 return;
             }
         }
         System.out.println("No One Can Handle");
    }
    
    public static void main(String[] args) {
         Action a1 = new Action(1);
         handler(a1);
         Action a2 = new Action(2);
         handler(a2);
         Action a3 = new Action(3);
         handler(a3);
    }
    
    수출 을 실현 한다.
    HANDLER_1 Handle This Action HANDLER_2 Handle This Action No One Can Handle
  • 매 거 진 상태 기 1 개 사건 의 완성 은 A -> B -> C -> D 네 가지 상 태 를 거 쳐 야 한다.
    public void process(Status status){
      switch(status.getStatus){
        case A:
           status.setStatus(B);
           break;
        case B:
           status.setStatus(C);
           break;
        ...   
      }
    }
    
    이것 은 사용 (if/else)/switch 으로 이 루어 진 것 이 고 우 리 는 enum 으로 이 루어 질 수 있다
    enum Status {
        A {
            @Override
            void process(Product pro) {
                pro.status = B;
            }
        },
        B {
            @Override
            void process(Product pro) {
                System.out.println("OK");
                pro.status = C;          //reset
            }
        },
        ...
        abstract void process(Product pro);
    }
    
    public static class Product{
        private Status status = Status.A;
        public void make(){
            status.process(this);
        }
    }
    
    public static void main(String[] args) {
        Product product = new Product();
        for (int i = 0; i < 10; i++) {
            System.out.println(product.status.name());
            product.make();
        }
    }
    
  • .
  • 다 중 배포 대상 의 유형 에 따라 방법 을 선택 하 는 것 이 바로 분파 (Dispatch) 이다.
  • 정적 할당 (컴 파일 시)
         static class A {}
         static class B extends A {}
         static class C extends A {}    
         public static void print(A obj){
             System.out.println("A");
         }
         public static void print(B obj){
             System.out.println("B");
         }
         public static void print(C obj){
             System.out.println("C");
         }
         public static void main(String[] args) {
             A a = new A();
             print(a);
             A b = new B();
             print(b);
             A c = new C();
             print(c);
         }
         ```
           
         > A
         > A
         > A
    
    -     (   )    
     ```java
     static class A {
         public void print(){
             System.out.println("A");
         }
     }
    
     static class B extends A {
         @Override
         public void print() {
             System.out.println("B");
         }
     }
     static class C extends A {
         @Override
         public void print() {
             System.out.println("C");
         }
     }
    
     public static void main(String[] args) {
         A a = new A();
         a.print();
         A b = new B();
         b.print();
         A c = new C();
         c.print();
     }
    
    출력
    A B C
  • 양 로 배포
     public enum Outcome { WIN, LOSE, DRAW } ///:~
     interface Item {
       Outcome compete(Item it);
       Outcome eval(Paper p);
       Outcome eval(Scissors s);
       Outcome eval(Rock r);
     }
    
     class Paper implements Item {
       public Outcome compete(Item it) {
           return it.eval(this);
       }
       public Outcome eval(Paper p) {
           return DRAW;
       }
       public Outcome eval(Scissors s) {
           return WIN;
       }
       public Outcome eval(Rock r) {
           return LOSE;
       }
       public String toString() {
           return "Paper";
       }
    }
    
     class Scissors implements Item {
         public Outcome compete(Item it) {
             return it.eval(this);
         }
    
         public Outcome eval(Paper p) {
             return LOSE;
         }
    
         public Outcome eval(Scissors s) {
             return DRAW;
         }
    
         public Outcome eval(Rock r) {
             return WIN;
         }
    
         public String toString() {
             return "Scissors";
         }
     }
    
     class Rock implements Item {
         public Outcome compete(Item it) {
             return it.eval(this);
         }
    
         public Outcome eval(Paper p) {
             return WIN;
         }
    
         public Outcome eval(Scissors s) {
             return LOSE;
         }
    
         public Outcome eval(Rock r) {
             return DRAW;
         }
    
         public String toString() {
             return "Rock";
         }
     }
    
     public class RoShamBo1 {
         static final int SIZE = 20;
         private static Random rand = new Random(47);
    
         public static Item newItem() {
             switch (rand.nextInt(3)) {
             default:
             case 0:
                 return new Scissors();
             case 1:
                 return new Paper();
             case 2:
                 return new Rock();
             }
         }
    
         public static void match(Item a, Item b) {
             //       a b       ,
             //      a.compete()       a compete(),
             //       compete       ,   b     
             //                 
             System.out.println(a + " vs. " + b + ": " + a.compete(b));
         }
    
         public static void main(String[] args) {
             for (int i = 0; i < SIZE; i++)
                 match(newItem(), newItem());
         }
     } 
    
    다 중 배포 란 a. plus (b) 를 호출 하 는 것 을 말 합 니 다. a 와 b 는 정확 한 유형 을 모 르 고 정상 적 인 상호작용 을 할 수 있 습 니 다.두 번 째 로 나 누 어 주 려 면 두 가지 방법 으로 호출 해 야 합 니 다. 첫 번 째 방법 은 첫 번 째 알 수 없 는 유형 을 결정 하고 두 번 째 방법 은 두 번 째 알 수 없 는 유형 을 결정 합 니 다.다 중 배 포 를 이용 하려 면 프로그래머 는 모든 유형 에 실제 적 인 방법 으로 호출 해 야 한다.일반적으로 프로 그 래머 는 하나의 방법 으로 더 많은 방법 을 호출 할 수 있 도록 어떤 설정 을 설정 해 야 하 며, 이 과정 에서 여러 유형 을 처리 할 수 있다.
  • 좋은 웹페이지 즐겨찾기