Effective 자바 - 사유 구조 기 강화 단일 속성 최 적 화 된 솔 루 션 매 거

\ # 개인 구조 함수 강화 singleton 속성
  • 공유 하 는 정적 구성원 은 final 도 메 인 이 고 구성원 의 성명 은 이런 유형 이 singleton 이라는 것 을 명확 하 게 표현 했다.
     public class Elvis {
         public static final Elvis INSTANCE = new Elvis();
         private Elvis() { }
         public void leaveTheBuilding() {
             System.out.println("Who a baby, I'm outta here!");
         }
         // This code would normally appear outside the class!
         public static void main(String[] args) {
             Elvis elvis = Elvis.INSTANCE;
             elvis.leaveTheBuilding();
         }
       }
    
  • 공유 정적 final 필드 가 아 닌 공유 정적 방법 을 제공 합 니 다.이 방식 은 더 큰 유연성 을 제공 하여 API 를 바 꾸 지 않 는 전제 에서 이 종 류 를 singleton 또는 비 singleton 으로 바 꿀 수 있다.
    public class Elvis {
             private static final Elvis INSTANCE = new Elvis();
             private Elvis() { }
             public static Elvis getInstance() { return INSTANCE; }
             public void leaveTheBuilding() {
                 System.out.println("Who  a baby, I'm outta here!");
             }
             // This code would normally appear outside the class!
             public static void main(String[] args) {
                 Elvis elvis = Elvis.getInstance();
                 elvis.leaveTheBuilding();
             }
           }  
    
  • 일반적으로 첫 번 째 방법 은 효율 이 약간 높 은 다음 에 첫 번 째 방법 으로 singleton 을 실현 한 후에 변 할 여지 가 없다. 이런 종 류 를 비 singleton 으로 바 꾸 려 면 분명히 안 된다.그 러 니 이 종류 가 singleton 이라는 것 이 확실 하지 않 으 면 첫 번 째 방법 을 사용 하 세 요.두 번 째 방법 을 사용 할 때, 만약 이 클래스 가 serializable 인 터 페 이 스 를 실현 한다 면, 다시 쓰기 (override) readResolve () 방법 을 사용 해 야 합 니 다. 그렇지 않 으 면 다시 정렬 할 때 새로운 실례 가 생 길 수 있 습 니 다. 이것 은 singleton 과 어 긋 납 니 다!
  • 현대 jvm 은 정적 공장 방법 을 내부 화 할 수 있다.
  • 방법 호출 함수 호출 은 이 함수 의 메모리 주소 로 먼저 이동 하고 프로그램 내용 을 읽 은 후에 함수 실행 전 방법 으로 이동 합 니 다.이 작업 은 현장 을 보호 하고 이 주 소 를 기억 하 며 현장 복 구 를 완료 해 야 합 니 다.이것 이 바로 통상 적 으로 말 하 는 창고 에서 나 오고 창고 에 들 어 가 는 것 이다. 이것 은 일정한 시간 과 메모리 비용 이 필요 하 다.
  • 내 연 함수.이 성능 소모 문 제 를 어떻게 해결 합 니까? 이 럴 때 내 연 함 수 를 도입 해 야 합 니 다. 프로그램 컴 파일 을 할 때 컴 파일 러 는 프로그램의 호출 표현 식 을 목표 함수 체 로 직접 교체 합 니 다.이렇게 하면 되 돌아 가 는 문제 가 발생 하지 않 을 것 이다. 그러나 컴 파일 할 때 함수 체 의 코드 를 프로그램 에 대체 하기 때문에 목표 프로그램의 코드 량 을 증가 시 켜 공간 소 비 를 증가 시 킬 것 이다. 그러나 시간 대리 판매 에 있어 함수 가 호출 될 때 처럼 크 지 않 기 때문에 이것 은 목표 코드 의 증 가 를 대가 로 시간 을 절약 하 는 것 을 알 수 있다.
  • C 코드 를 쓸 때 우 리 는 간단 한 논 리 를 매크로 에 정의 하 는 것 을 배 웠 다.이렇게 하면 컴 파일 러 가 컴 파일 할 때 이 매크로 를 사용 하 는 곳 을 매크로 코드 로 직접 교체 하 는 것 이 장점 이다.이렇게 하면 더 이상 호출 방법 과 같은 스 택 을 쌓 고 스 택 을 나 가 인삼 을 전달 할 필요 가 없다.성능 이 향상 되 었 다.내 연 함수 의 처리 방식 은 매크로 와 유사 하지만 매크로 와 는 다 릅 니 다. 내 연 함 수 는 함수 자체 의 특성 (유형, 역할 영역 등) 을 가지 고 있 습 니 다.C + + 에 내 연 함수 가 있 습 니 다. inline 키 워드 를 사용 하여 수식 합 니 다.또한, Class 정의 에 적 힌 함수 도 컴 파일 러 에 의 해 내 연 함수
  • 로 간 주 됩 니 다.
  • C + + 가 내 연 함수 인지 여 부 는 스스로 결정 하고 자바 는 컴 파일 러 에 의 해 결정 된다.자바 는 내 연 함수 로 직접 설명 하 는 것 을 지원 하지 않 습 니 다. 내 연 을 시 키 려 면 컴 파일 러 에 만 요청 할 수 있 습 니 다. 키워드 final 수식 은 그 함수 가 JVM 내 연 되 기 를 원 하 는 것 임 을 가리 키 는 데 사 용 됩 니 다.public final void dealSomthing() {}
  • jvm 내 연 운행 시 최적화 되 고 a, 짧 은 방법 은 jvm 최적화 에 유리 하 다.(절차 가 더욱 뚜렷 하고 역할 영역 이 짧 으 며 부작용 도 뚜렷 하 다) 긴 방법 으로 무릎 을 꿇 었 다.b. 작은 방법 이 자주 실행 되 고 jvm 은 내 연 을 수행 합 니 다.(방법의 호출 을 방법 체 자체 로 대체 합 니 다)
    private int add4(int x1, int x2, int x3, int x4) {  
            return add2(x1, x2) + add2(x3, x4);  
        }  
    
        private int add2(int x1, int x2) {  
            return x1 + x2;  
        }
    //         jvm             
    private int add4(int x1, int x2, int x3, int x4) {  
            return x1 + x2 + x3 + x4;  
        }  
    
  • 자바 1.5 이후 싱글 톤 을 실현 하 는 세 번 째 방법 이 있 습 니 다. 하나의 요 소 를 포함 하 는 매 거 진 형식 만 작성 해 야 합 니 다.그 는 공유 역 방법 과 유사 하 다.그러나 이 는 직렬 화 체제 (자유 직렬 화) 를 무상 으로 제공 하여 여러 번 의 정례 화 (스 레 드 안전) 가 복잡 한 직렬 화 와 반사 공격 에 직면 하 더 라 도 절대적 으로 방지 했다.
    enum SingletonDemo{
            INSTANCE;
            public void otherMethods(){
                System.out.println("Something");
            }
        }
    
    우리 가 이전에 사용 한 매 거 진 것 은 보통 여러 속성의 상수 로 switch
    enum Color{
        RED,GREEN,BLUE;
    }
    public class Hello {
        public static void main(String[] args){
            Color color=Color.RED;
            int counter=10;
                switch (color){
                    case RED:
                        System.out.println("Red");
                        color=Color.BLUE;
                        break;
                    case BLUE:
                        System.out.println("Blue");
                        color=Color.GREEN;
                        break;
                    case GREEN:
                        System.out.println("Green");
                        color=Color.RED;
                        break;
                }
            }
        }
    }
    
    에 사용 되 었 다.
  • enum 은 Enum 류 를 계승 하여 이 루어 진 것 으로 enum 구 조 는 하위 클래스 로 다른 종 류 를 계승 할 수 없 지만 인 터 페 이 스 를 실현 할 수 있다.그 밖 에 enum 류 도 계승 되 지 못 한다. 반 컴 파일 에서 우 리 는 이 류 가 final 이라는 것 을 발견 할 수 있다
  • .
  • enum 은 private 의 구조 만 있 고 외부의 추가 구 조 를 방지 합 니 다. 이것 은 마침 단일 모델 과 일치 하 며 단일 사례 성 을 확보 하기 위해 자 리 를 깔 았 습 니 다.이 private 구조 기 를 펼 쳐 보 세 요. 만약 에 우리 가 손 으로 구조 기 를 쓰 지 않 는 다 면 기본 적 인 빈 파 라 메 트릭 구조 기 가 있 을 것 입 니 다. 우 리 는 매개 변수 파 라 메 트릭 을 통 해 클래스 의 초기 화 를 실현 할 수 있 습 니 다.
  • private 수식 자 는 구조 기 에 대해 생략 할 수 있 지만 구조 기의 권한 이 기본 권한 이라는 것 은 아 닙 니 다.
      enum Color{
        RED(1),GREEN(2),BLUE(3);
        private int code;
        Color(int code){
            this.code=code;
        }
        public int getCode(){
            return code;
        }
      }
    
  • enum 이 어떻게 일 하 는 지 에 대해 역 컴 파일 해 야 한다.매 거 진 을 사용 하 는 것 은 정적 클래스 내부 로드 방법 을 사용 하 는 원리 와 유사 하 다.매 거 진 은 다음 과 같은 형식 으로 컴 파일 됩 니 다. public final class T extends Enum{} 매 거 진 양의 실현 은 Public static final T 형식의 초기 화 되 지 않 은 변수 입 니 다. 그 다음 에 정적 코드 에서 매 거 진 양 을 초기 화 합 니 다.따라서 매 거 진 사례 로 하나의 예 를 들 면 이러한 로드 시간 은 굶 주 린 사람 모델 과 비슷 하고 lazy - loading 의 역할 을 하지 않 습 니 다.
  • 직렬 화 와 반 직렬 화 에 대해 모든 매 거 진 유형 과 매 거 진 변 수 는 JVM 에서 유일한 것 이다. 즉, 자바 가 직렬 화 와 반 직렬 화 매 거 진 때 특별한 규정 을 했 기 때문에 매 거 진 writeObject, readObject, readObject NoData, writeReplace 와 readResolve 등 방법 은 컴 파일 러 에 의 해 사용 되 지 않 는 다.따라서 직렬 화 인 터 페 이 스 를 실현 한 후 readObject 를 호출 하면 단일 사례 를 파괴 하 는 문제 도 존재 하지 않 는 다.

  • 좋은 웹페이지 즐겨찾기