제2 장 창설 및 소각 대상
제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) 는 유형 적 추 도 를 실 현 했 기 때문에 그리 복잡 하지 않다.
열세
정적 공장 방법의 열세
클래스 가 공유 되 거나 보 호 받 는 구조 기 를 포함 하지 않 으 면 이불 류 화 할 수 없다.
그것들 은 다른 정적 방법 과 실제로 아무런 차이 가 없다.
확실히 정적 방법 은 정적 방법 일 뿐 입 니 다. 문서 에 이러한 인 스 턴 스 를 만 드 는 것 이 언급 되 지 않 으 면 정적 방법 을 사용 할 수 있 을 때 무시 하기 쉽 습 니 다.
그래서 우 리 는 일정한 명명 습관 을 지 켜 야 한다.
정적 방법 추천 이름
선택 가능 한 매개 변수 로 확장 할 수 없습니다.
매개 변수 가 매우 많 을 때 정적 방법의 가 독성, 유지 보수 성 등 이 매우 떨어진다.
실제 운용
현재 우리 가 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 () 방법 은
FALSE
과 TRUE
을 다시 사용 하여 같은 기능 의 대상 을 만 들 지 않도록 합 니 다.자동 포장 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
(솔직히 이거 진짜 안 써 봤 어)못 알 아 봤 어 요. 기록 좀 해 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.