Effective Java 독서 노트 1 객체 만들기 및 제거

5501 단어 EffectiveJava
제1조: 구조기 대신 정적 공장 방법을 고려
 
  • 정적 공장 방법은 명칭이 있어 되돌아오는 대상의 특성을 더욱 잘 설명할 수 있다.예를 들어 같은 유형의 두 가지 구조 방법, 방법의 매개 변수 유형은 같지만 순서가 다르기 때문에 사용자는 두 구조기의 차이를 글자에서 구분할 수 없다
  • 정적 공장 방법은 대상의 창설 여부
  • 를 제어할 수 있다
  • 인터페이스에 정적 방법이 있을 수 없기 때문에 인터페이스Types의 정적 공장 방법은 Types라는 실례화 클래스에 놓여 있다.(Collection,Collections).클라이언트가 인터페이스를 통해 되돌아오는 대상을 직접 실현 클래스로 되돌아오는 것이 아니라 인용하는 것은 좋은 프로그래밍 습관이다.이렇게 하는 또 다른 이유는 기존의 인터페이스 구조에서 서로 다른 실현 유형을 통해 구조의 확장을 완성할 수 있기 때문이다.JDBC
  • 매개 변수화 형식의 실례를 만들 때 코드를 더욱 간결하게 합니다.(방법 성명의 지루함...)

  • 단점:
  • 류는 공유되거나 보호된 구조기가 없으면 이불류화
  • 정적 공장 방법은 다른 정적 방법과 실제적으로 아무런 차이가 없어 JAVADOC에서 식별하기 어렵다.

  • 일반적인 정적 플랜트 방법 이름:
    valueOf, of, getInstance, newInstance, getType, newType
    제2조: 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다
    정적 공장 방법이든 구조기 방법이든 여러 개의 구조기 파라미터를 만날 때 매우 번잡해 보인다.일반 프로그래머는 중첩 구조기 모드(telescoping constructor)를 사용하여 매개 변수가 없는 매개 변수, 매개 변수, 두 개의 매개 변수를 포함하여 여러 개의 구조기를 설정합니다.모든 매개변수를 덮어쓸 때까지.이런 방식은 구조기의 매개 변수가 많을 때 불가능하다는 것이 분명하다.그리고
    매개 변수가 조금 많을 때, 사용자는 매개 변수가 무엇을 대표하는지 하나하나 세어 각각 확인해야 한다.
    다른 방법은 자바빈 방식이다. 즉, 먼저 무참구조기로 대상을 만들고 setter를 통해 값을 부여해야 하는 필드에 값을 부여하는 것이다.구조 과정이 몇 가지 다른 단계로 나뉘었기 때문에 JAVA BEAN은 불일치 상태에서 비롯되었을 수도 있고 변할 수 없는 가능성을 만들어 라인 안전에 문제가 있을 수도 있다.
    중국 방문에 가장 적합한 해결 방법은 4가지 Builder 모드입니다.
     
    public class NutritionFacts {
    	private final int servingSize;
    	private final int servings;
    	private final int calories;
    	private final int fat;
    	private final int sodium;
    	private final int carbohydrate;
    	
    	public static class Builder{
    		//Required parameters
    		private final int servingSize;
    		private final int servings;
    		
    		//Optional parameters - initialized to default values
    		private int calories 		= 0;
    		private int fat				= 0;
    		private int carbohydrate 	= 0;
    		private int sodium			= 0;
    		
    		public Builder(int servingSize, int servings){
    			this.servingSize = servingSize;
    			this.servings	 = servings;
    		}
    		
    		public Builder calories(int val){
    			calories = val;
    			return this;
    		}
    		
    		public Builder fat(int val){
    			fat = val;
    			return this;
    		}
    		
    		public Builder carbohydrate(int val){
    			carbohydrate = val;
    			return this;
    		}
    		
    		public Builder sodium(int val){
    			sodium = val;
    			return this;
    		}
    		
    		public NutritionFacts build(){
    			return new NutritionFacts(this);
    		}
    	}
    	
    	private NutritionFacts(Builder builder){
    		servingSize 	= builder.servingSize;
    		servings		= builder.servings;
    		calories		= builder.calories;
    		fat				= builder.fat;
    		sodium			= builder.sodium;
    		carbohydrate	= builder.carbohydrate;
    	}
    }

     
     
    NutritionFacts cocaCola = new NutritionFacts.Builder(240,0).calories(100).sodium(35).carbohydrate(27).build();
     
    한 개의builder로 여러 개의 대상을 구축하여 추상적인 공장을 만들 수도 있다.1.5 이후에는 일반형도 사용할 수 있다.
     
    블러더 모드가 중첩 구조기보다 더 지루할 수 있기 때문에 파라미터가 충분할 때만 사용할 수 있음을 알 수 있다.
     
    제3조: 개인 구조기나 매거 유형으로singleton 속성 강화
    일반적으로singleTon 모드를 실현하는 것은 구조 방법을private로 수식하고singleton의 클래스를public static final 인용으로 유일한 실례 대상을 가리키는 것이다.그러나 이런 방식은 반사적으로 해독될 수 있다. 개선된 방식은 개인 구조기에 판단을 설정하고 두 번째 실례를 생성하려면 이상을 던지는 것이다.
     
    또 다른 방법은 정적 공장 방법을 사용하여 진정한 유일한 실례를 하나의 private static final 인용에 저장하는 것이다. 앞의 방법에 비해 앞의 방법은 공유역 방법을 사용해서 내연을 실현하고 효율을 높일 수 있지만 현대 JVM은 모두 공공static 방법에 내연을 호출했기 때문에 효율에 손실이 없다.또한 공장 방법은 유연성을 높여 한층 더 수정(singleton, 제어 실례 제거)을 위해 수정 공간을 제공했다.
     
    1.5부터 세 번째 방법이 나왔다.
     
    public enum Elvis{
    INSTANCE;
    }
     
    이런 방식은 기능적으로 공유역 방법과 비슷하지만 더욱 간결하고 서열화 메커니즘을 제공하여 반사 공격을 막을 수 있어 Singleton을 실현하는 가장 좋은 방법이다.
     
    제4조: 사유구조기를 통해 실례화할 수 없는 능력을 강화
    정적 도구 방법만 제공하는 일부 도구 유형에 대해 실례화는 무의미하다. 이럴 때 사유 구조기를 현저하게 제공하여 실례화하는 행위를 막아야 한다.심지어 개인 구조기에서 throw new Assertion Error () 이상을 던졌는데, 이 작법은 약간 오도된 것이기 때문에 주석 설명을 넣어야 한다.
     
    이런 용법도 부작용이 있고 수식된 종류는 계승할 수 없다(자류화)
     
    제5조: 불필요한 대상을 만드는 것을 피한다
    정적 공장은 구조기보다 우선적이다. 정적 공장은 대상을 중용할 수 있기 때문에 구조기는 항상 새로운 대상을 구성한다
     
    예를 들어 날짜 비교 도구에 대해 Calendar를 얻은 실례는 실례적인 방법에 쓰지 말고 정적 코드 영역에 써야 한다. 이렇게 하면 한 번만 반복해서 사용할 수 있다.이런 효율 차이는 아마도 백 배 이상에 달할 것이다.
     
    포장류가 아닌 기본 유형을 우선적으로 사용하다
     
    제6조: 기한이 지난 대상 인용 제거
    창고 용기로 수조를 사용하면push 대상이 수조 상한선을 초과하면 더 큰 수조를 생성합니다.선진 창고의 원소는 회수되지 않을 것이다. (수조가 재분배되지 않은 상황에서 수조는 이 원소의 인용을 보존하고 있다.) 이것은 기한이 지난 인용이라고 부른다.
     
    수동으로 비우는 방식으로 기한이 지난 인용을 없앨 수 있지만 지나치게 사용하지 마라. 이번에는 코드가 어지러워지는 상황이 좋은 코드 스타일이 아니다.
     
    만료된 인용을 없애는 가장 좋은 방법은 이 인용을 포함하는 변수가 생명 주기를 끝내는 것이다.
     
    클래스가 스스로 메모리를 관리하기만 한다면 프로그래머는 메모리 유출 문제를 경계해야 한다.
     
    또 다른 메모리 유출이 발생할 가능성이 높은 곳은 캐시다.WeakHashMap은 캐시를 나타낼 수 있으며 캐시에 있는 항목이 만료되면 자동으로 삭제됩니다.WeakHashMap은 필요한 캐시 항목의 주기가 값이 아닌 키의 외부에서 참조되는 경우에만 사용할 수 있습니다.
     
    캐시된 데이터의 가치 여부는 현명한 문제이기 때문에, 명확한 작업을 백엔드 라인에 맡길 수 있습니다. (Timer/scheduled Thread Pool Executor)
     
    제7조:finalize 사용 피하는 방법
    finalize 방법의 단점:
    제때에 집행될 것을 보장할 수 없다.finalize 방법으로 열린 파일을 닫는 것은 심각한 오류입니다.
    finalize 방법의 실행 시간은 서로 다른 JVM에서 현저하게 다르기 때문에 이를 사용하면 이식성에 해롭다.
    JAVA도 finalize 방법이 실행될 거라고 장담할 수 없어요.
    포획되지 않은 이상은finalize 방법에서 던져지며 무시되고finalize 방법은 종료됩니다.
    finalize 방법을 사용하면 심각한 성능 문제가 있습니다
     
    대체 방식은 이 종류의 클라이언트가 모든 실례가 더 이상 사용되지 않을 때 호출하도록 하는 현저한 종료 방법을 제공하는 것이다.예를 들어 InputStream의 close 방법입니다.finally 방법과 결합하여 사용하는 것이 가장 좋다
     
     

    좋은 웹페이지 즐겨찾기