제2 장 창설 및 소각 대상

8482 단어
언제, 어떻게 대상 을 만 드 는 지, 언제, 어떻게 생 성 대상 을 피 하 는 지, 어떻게 적시에 소각 하 는 지, 어떻게 관리 대상 이 소각 하기 전에 필요 한 청 소 를 합 니까?
제1조 구조 기 대신 정적 공장 방법 을 고려
정적 공장 방법 은 인 스 턴 스 를 되 돌려 주 는 정적 방법 으로 이 는 일반적인 정적 방법 일 뿐 이 므 로 주의해 야 할 것 은 디자인 모델 의 공장 방법 과 달리 헷 갈 리 지 않도록 하 는 것 이다.
자바 소스 코드 의 예:
 public static Boolean valueOf(boolean b){
    return b?Boolean.TRUE:Boolean.FALSE;
 }

우세 하 다.
정적 공장 방법 이 구조 기 에 비해 어떤 장점 이 있 는 지 열거 하 다.
정적 공장 방법 이름
구조 방법 에 이름 이 없 으 면 정적 공장 에 적당 한 방법 이름 을 지어 주면 읽 기 쉽 고 클 라 이언 트 가 사용 하기 쉽다.
특히 여러 개의 매개 변수 나 여러 개의 구조 방법 이 있 는 유형 에 직면 할 때 클 라 이언 트 로 하여 금 구조 방법 을 어떻게 선택 하 는 지 모 르 게 한다 (자체 적 으로 대문자 로 멍 B 를 보충 하 는 것).
호출 할 때마다 새 대상 을 만 들 필요 가 없습니다.
우 리 는 구조 방법 이 매번 새로운 인 스 턴 스 를 만 드 는 것 을 알 고 있 습 니 다. 우 리 는 불필요 한 대상 (또는 가 변 적 이지 않 은 클래스) 을 반복 적 으로 만 드 는 것 을 피해 야 할 때 구조 적 방법 으로 는 할 수 없 으 며, 정적 방법 은 같은 대상 을 반복 적 으로 호출 할 수 있 습 니 다 (예 를 들 어 돌아 오 는 대상 보다 하나의 사례 가 필요 합 니 다).
그것들 은 원래 되 돌아 오 는 형식의 모든 하위 형식의 대상 을 되 돌려 줄 수 있다
구조 방법 은 클래스 자체 만 되 돌아 갈 수 있 고 정태 적 인 방법 은 그의 하위 클래스 로 돌아 갈 수 있다. 다 중 적 인 특성 을 이용 하여 정태 적 인 방법 을 더욱 유연 하 게 할 수 있다. 예 를 들 어 Executors 류 의 각종 newxxx 방법 은 ExecutorService 의 하위 클래스 로 돌아 갈 수 있다.
매개 변수 화 형식 인 스 턴 스 를 만 들 때 코드 를 더욱 간결 하 게 만 듭 니 다.
매개 변수 화 구조 기 를 호출 할 때 형식 매개 변수 가 뚜렷 하 더 라 도 반드시 밝 혀 야 합 니 다. 책 에는 HashMap 의 예 를 들 어 있 습 니 다.
Map>m = new HashMap>();

정적 공장 으로 이렇게 쓸 수 있다 면:
public static HashMapnewInstance(){
    reutrn new HashMap();
}

생각해 보 니 예전 에 도 이런 유형의 지정 이 귀 찮 았 고 긴 꼬치 를 썼 지만 현재 의 JVMS (자바 1.7) 는 유형 적 추 도 를 실 현 했 기 때문에 그리 복잡 하지 않다.
열세
정적 공장 방법의 열세
클래스 가 공유 되 거나 보 호 받 는 구조 기 를 포함 하지 않 으 면 이불 류 화 할 수 없다.
그것들 은 다른 정적 방법 과 실제로 아무런 차이 가 없다.
확실히 정적 방법 은 정적 방법 일 뿐 입 니 다. 문서 에 이러한 인 스 턴 스 를 만 드 는 것 이 언급 되 지 않 으 면 정적 방법 을 사용 할 수 있 을 때 무시 하기 쉽 습 니 다.
그래서 우 리 는 일정한 명명 습관 을 지 켜 야 한다.
정적 방법 추천 이름
  • value Of 가 되 돌아 오 는 인 스 턴 스 는 매개 변수 와 같은 값 을 가지 고 있 으 며, 일반적으로 형식 변환 (예 를 들 어 String Boolean Double 등)
  • 에 사 용 됩 니 다.
  • of value Of 의 간결 한 대체
  • getInstance 가 되 돌아 오 는 인 스 턴 스 도구 매개 변 수 는 정 해 져 있 으 며, 단일 사례 에 대해 서 는 일반적으로 매개 변수 가 없 으 며, 매번 돌아 오 는 것 은 같은 인 스 턴 스
  • 입 니 다.
  • new Instance 는 매번 새로운 인 스 턴 스 를 되 돌려 줍 니 다
  • getType
  • newType

  • 선택 가능 한 매개 변수 로 확장 할 수 없습니다.
    매개 변수 가 매우 많 을 때 정적 방법의 가 독성, 유지 보수 성 등 이 매우 떨어진다.
    실제 운용
    현재 우리 가 Fragment 를 새로 만 들 때 AS 는 자동 으로 하나의 newInstance(String ,String ) 방법 을 생 성 할 것 이다. 이것 이 바로 정적 공장 방법 이다. 이 를 통 해 정부 에서 도 우리 에 게 정적 공장 방법 을 사용 하 는 것 을 추천 하 는 것 을 알 수 있다.
    또한 자바 소스 코드 에 도 정적 공장 방법 을 많이 활용 합 니 다. 예 를 들 어 위 에서 언급 한 Executors 을 직접 체험 하 세 요 ~
    작은 매듭
    정적 공장 방법 과 구조 기 는 각각 장점 이 있 지만 일반적으로 정적 공장 은 더욱 적합 하기 때문에 앞으로 정적 공장 을 많이 사용 하 는 것 을 고려 하 세 요.
    제2 조 여러 구조 기 파 라 메 터 를 만 났 을 때 구축 기 (Builder) 를 사용 하 는 것 을 고려 해 야 한다.
    하나의 유형 을 예화 할 때 선택 할 수 있 는 매개 변수 가 많 을 때 우 리 는 서로 다른 매개 변수의 구조 방법 을 많이 쓸 수 있 고 가 독성 이 매우 떨 어 질 것 이다. 또한 클 라 이언 트 도 언제 어떤 구조 기 를 사용 하 는 지 모른다. 이것 은 매우 나 쁜 것 이다. 마찬가지 로 정태 적 인 공장 도 피 할 수 없다. 이 럴 때 우 리 는 구축 기, 즉 디자인 모델 중의 Builder 모델 을 사용 해 야 한다.
    Builder 모드 는 매우 흔 합 니 다. 열 을 열거 하면 지나 갑 니 다.
            AlertDialog dialog = new AlertDialog.Builder(this)
                    .setCancelable(true)
                    //...               
                    .setMessage("Builder  ")
                    .create();
    

    Builder 모드 는 여러 매개 변수 가 발생 하 는 문 제 를 해결 할 수 있 지만 단점 도 있 습 니 다. 대상 을 만 들 기 위해 서 는 먼저 Builder 를 만들어 야 합 니 다. 이것 은 불필요 한 비용 입 니 다. 비록 비용 이 현저 하지 않 지만 존재 합 니 다.
    작은 매듭
    여러 개의 인자 가 있 을 때 Builder 모드 는 매우 좋 은 선택 입 니 다.
    제3 조 개인 구조 기 또는 매 거 유형 으로 Singleton 속성 강화
    이른바 Singleton 이란 단 례 로 단지 한 번 실례 화 된 종 류 를 가리 키 는데 이것 은 단 례 와 밀접 한 관 계 를 가진다.
    사유 구조 기 강화
    단 례 를 쓴 사람 은 반드시 알 아야 한다. 구조 기 는 반드시 사유 해 야 한다. 그렇지 않 으 면 다른 사람 이 마음대로 new 를 쓰 는데 어떻게 단 례 를 보장 할 수 있 겠 는가?
    책 에 서 는 반 사 를 어떻게 방지 하고 반 서열 화 를 방지 하 는 지 에 대해 서도 언급 하 였 으 니, 여 기 는 언급 하지 않 겠 다.
    매 거 강화
    자바 1.5 버 전 이후 하나의 실현 방법 (하나의 요 소 를 포함 한 매 거 진 형식) 이 추가 되 었 습 니 다.
    public enum Elvis{
        INSTANCE;
        public void leaveTheBuilding(){...}
    }
    

    우세:
  • 직렬 화 메커니즘 무상 제공
  • 여러 번 의 정례 화 를 절대 방지
  • 반사 방지
  • 간결 함
  • 책 에 따 르 면 단일 요소 의 매 거 진 유형 은 싱글 톤 을 실현 하 는 가장 좋 은 방법 이 되 었 다. 안 타 깝 게 도 나 는 실제 적 으로 사용 해 본 적 이 없고 이런 실현 방식 을 본 적 이 없다.
    작은 매듭
    일례 로 많은 실현 방식 도 쉽 지 않 습 니 다 ~
    제4 조 사유 구조 기 를 통 해 실례 화 할 수 없 는 능력 을 강화한다
    우선 실례 화 할 수 없 는 것 이 무엇 인지 이해 합 니까?실례 화 할 수 없 는 것 은 정적 방법 과 정적 영역 만 포함 하 는 클래스, 예 를 들 어 BitmapUtil 등 각종 Utils 를 말 합 니 다. 그들 은 각종 정적 방법 을 포함 하지만 실제 적 으로 우 리 는 그것 을 실례 화 할 필요 가 없습니다!
    정적 필드 (static - field) 예: public static Object obj공구 류 가 실례 화 되 기 를 원 하지 않 는 이상 어떻게 합 니까?
    개인 구조 기 를 제공 하고 그 안에 이상 을 던 지면 됩 니 다.
    eg:
    public class Util{
      private Util{
       // Suppress default constructor for noninstantiability
       throw new AssertionError();
      }
    }
    

    쓸데없는 짓 을 할 거 라 고 믿 습 니 다. 누가 tm 가 사례 화학 기구 류 에 갈 일이 없 었 습 니까? 예전 에 저도 그렇게 생각 했 습 니 다. 제 무릎 에 닿 을 때 까지...
    가끔 은 내 가 우수한 라 이브 러 리 에서 이 글 씨 를 볼 때 까지, 예 를 들 어 RxJava 의 Subscriptions 종류:
    public final class Subscriptions {
        private Subscriptions() {
            throw new IllegalStateException("No instances!");
        }
        //...
    }
    

    또한 Jake 대 신의 RxBinding 중 각종 RxXXXX 도 마찬가지다.
    private RxAppBarLayout() {
        throw new AssertionError("No instances.");
      }
    

    우수한 프로젝트, 세부 처리 가 모두 매우 우수 하 다.
    작은 매듭
    때로는 어떤 것들 은 매우 일리 가 있다. 단지 자신 이 너무 약해 서 깨 닫 지 못 할 뿐, 겸허 하 게 공부 하고, 계속 성장 할 뿐이다.
    PS: EffectiveJava 는 좋 은 책 입 니 다. RxJava 는 우수한 라 이브 러 리 입 니 다. Jake 는 정말 큰 신 입 니 다!!
    제5 조 불필요 한 대상 을 만 드 는 것 을 피한다.
    일반적으로 필요 할 때마다 같은 기능 의 새로운 대상 을 만 드 는 것 이 아니 라 마지막 으로 대상 을 다시 사용 할 수 있 습 니 다. 또한 가 변 적 이지 않 은 대상 (immutable 뒤에 말 합 니 다) 에 대해 서 는 항상 재 활용 할 수 있 습 니 다.
    작 가 는 몇 가지 예 를 들 어 설명 했다.
    String 인 스 턴 스 생 성String s = "stringette"; 로 대체 String s = new String("stringette") 후자 의 매개 변 수 는 하나의 인 스 턴 스 이기 때문에 매번 호출 할 때마다 쓸모없는 대상 을 하나 더 만 듭 니 다.
    Boolean
        public static final Boolean TRUE = new Boolean(true);
        public static final Boolean FALSE = new Boolean(false);
    

    Boolean. valueOf () 방법 은 FALSETRUE 을 다시 사용 하여 같은 기능 의 대상 을 만 들 지 않도록 합 니 다.
    자동 포장 autoboxing
    자동 포장 은 기본 유형 과 포장 기본 유형 (Boxed Primitive Type) 을 혼용 할 수 있 으 며, 필요 에 따라 자동 으로 포장 하고 분해 할 수 있 습 니 다.
    그들 둘 사이 의 성능 은 현저 한 차이 가 있다.
    eg:
    public static void main(String[] args){
        Long sum = 0L;
        for(long i=0;i

    sum 의 유형 은 Long 입 니 다. 이렇게 하면 long 보다 약 2 의 31 차방 의 Long 인 스 턴 스 를 더 만 들 고 성능 에 영향 을 줍 니 다. 소요 시간 은 long 의 6 배가 넘 습 니 다. 매우 무 섭 습 니 다.
    so, 기억, 기본 유형 우선 사용!
    PS 여기 서 말 하고 자 하 는 것 은 창설 대상 이 매우 비 싼 것 이 아니 라, 작은 대상 의 창설 과 회수 가 매우 저렴 하기 때문이다
    대상 풀 (object pool)
    데이터베이스 연결 탱크 와 같은 비상 중량급 대상 만 을 만 들 지 않도록 대상 탱크 를 유지 합 니 다.
    Android 에는 대상 풀 이 많 습 니 다. 예 를 들 어 Message 클래스 도 있 고 Glide 의 Bitmap 풀 도 있 습 니 다.
    대상 지 의 단점
  • 코드 가 더욱 복잡 하고 회수, 재 활용 과 관련 되면 반드시 많은 코드 가 증가 할 것 이다
  • 메모리 사용량 증가, 성능 손상
  • 작은 매듭
    다시 사용 해 야 할 때 만 들 지 마 십시오.
    제6 조 만 료 대상 인용 제거
    우선 자바 가 GC 가 있어 도 메모리 관 리 를 스스로 고려 해 야 한 다 는 것 을 명확 하 게 해 야 한다.
    하나의 배열 이 확 대 된 후에 줄 어 듭 니 다. 예 를 들 어 size 는 0 - > 200 - > 100 (하나의 스 택 이 먼저 증가 하고 나중에 수축) 이 라면 요소 의 index > = 100 의 요소 (pop 에 의 해 떨 어 진) 는 모두 기한 이 지난 요소 라 고 할 수 있 습 니 다. 그 인용 은 기한 이 지난 인용 (영원히 해제 되 지 않 는 인용) 입 니 다.
    만 료 된 인용 으로 메모리 가 유출 되 었 습 니 다.
    자신 에 게 pop 에서 떨 어 진 요 소 는 사용 하지 않 지만 만 료 된 인용 이 존재 하기 때문에 GC 는 이 인용 을 회수 하지 않 기 때문에 수 동 으로 삭제 해 야 합 니 다.
    eg:
    public Object pop(){
        if(size==0) throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null; //Eliminate obsolete reference
        return result;
    }
    

    PS: 책 에는 디스크 교환 (Disk Paging) -- > wiki 비고: 가상 메모리 도 언급 되 어 있 습 니 다.
    제7 조 종결 방법 사용 을 피한다.
    종결 방법: finalizer (솔직히 이거 진짜 안 써 봤 어)
    못 알 아 봤 어 요. 기록 좀 해 주세요.
  • 종결 방법 은 행위 가 불안정 하고 성능 이 떨 어 지 며 이식 가능 한 문제
  • 를 초래 할 수 있다.
  • 제때에 실 행 될 것 이 라 고 장담 할 수 없고 실 행 될 것 이 라 고 장담 할 수 없다 (이.. 너무 하 다..)
  • 아직도 못 알 아 보고 어리석게 울 었 어..

    좋은 웹페이지 즐겨찾기