##2장. 객체 생성과 파괴.
그 클래스의 인스턴스를 반환하는 단순한 정적 메서드.
public static Boolean valueOf(boolean b){
return b ? Boolean.TRUE : Boolean.FALSE;
}
이 메서드는 기본타입인 boolean 값을 받아 Boolean 객체 참조로 변환해준다.
디자인 패턴에서의 팩터리 메서드와는 다르다.
이름을 가질 수 있다.
호출할 때마다 인스턴스를 새로 생성하지 않아도 된다.
(a == b ? a.equeals(b))
반환 타입의 하위 타입 객체를 반환할 수 있느 능력이 있다.
java.util.Collections
에서 정적팩터리 메서드를 통해 얻는다.입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
EnumSet
클래스(아이템 36)은 오직 정적팩터리만 제공하는데, 원소가 64개이하면 RegularEnumSet
의 인스턴스를, 65개 이상이면 JumboEnumSet
의 인스턴스를 반환한다.정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
상속을 하려면 public
이나 protected
생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
정적 팩터리 메서드는 프로그래머가 찾기 어렵다.
선택적 매개변수가 많을 때의 대처.
점층적 생성자 패턴.
자바빈즈 패턴
Setter
를 이용해 원하는 iv
의 값을 할당해준다빌더 패턴
Setter
메소드를 이용해 원하는 매개변수를 설정한다. 마지막으로 매개변수가 없는 build
ㅁㅔ서드를 호출해 객체를 얻는다.public class NutritionFacts{
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
/* 정적멤버클래스 Builder 시작.*/
public static class Builder{ //start of Inner Class
//필수매개변수
private final int servingSize;
private final int servings;
//선택매개변수(기본값으로 초기화한다.)
private final int calories = 0;
private final int fat = 0;
public Builder(int servingSize, int servings){
this.servingSize = servingSize;
this.servings = servings;
}
public Builder fat(int val){
fat = val;
return this;
}
public Builder calories(int val){
calories = val;
return this;
}
//NutritionFacts 객체를 반환할 build() 시작
public NutritionFacts build(){
return new NutritionFacts(this);
}
} //end of Inner Class
private NutritionFacts(Builder build){
servingSuze = build.servingSize;
servings = build.servings;
calories = build.calories;
fat = build.fat;
}
}
NutritionFacts cocalCola = new NuritionFacts.Builder(240, 8).fat(100).calories(200).build();
인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다.
Elvis.INSTANCE
초기화할 때 딱 한번만 호출.)public class Elvis{
public static final Elvis INSTANCE = new Elvis();
private Elvis() {...}
public void leaveTheBuilding() { ... }
}
public class Elvis{
private static final Elvis INSTANCE = new Elvis();
private Evis() {...}
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
//싱글턴임을 보장해주는 readResolve메서드.
private Object readResolve(){
//진짜 Elvis를 반환하고, 가짜 Elvis는 가비지컬렉터에 맡긴다.
return INSTANCE;
}
}
public enum Elvis{
INSTANCE;
public void leaveTheBuilding() { ... }
}
java.lang.Math
, java.util.Arrays
등.