2장은 객체의 생성과 파괴를 다룬다.
// 정적 팩터리 메서드 예시)
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
public class Car {
public int num;
// 생성자(이름 x)
public Car(int num) {
this.num = num;
}
// 정적 팩터리 메서드(이름 o: car)
public static Car create(int num) {
return new Car(num);
}
}
a == b
일 때만 a.equals(b)
성립. feat. enum )public class Car {
private int num;
private static Car[] arr = {new Car(0), new Car(1)};
private Car(int num) {
this.num = num;
}
// 정적 팩터리 메서드: arr 안에 선언된 객체 재사용
public static Car of(int num) {
if(num == 0) return arr[0];
else if(num == 1) return arr[1];
return null;
}
}
public class Car {
private int num;
public Car(int num) {
this.num = num;
}
// 정적 팩토리 메소드
public static Car createElectric(int num) {
return new ElectricCar(num); // Car 클래스를 상속하는 ElectricCar 객체 리턴
}
}
클라이언트를 구현체로부터 분리
서비스 제공자 프레임워크의 근간 (ex. JDBC, 의존성 주입(DI) 프레임워크)
3(+1)개의 핵심 컴포넌트로 이루어짐
컴포넌트 | 설명 | JDBC |
---|---|---|
서비스 인터페이스 (service interface) | 구현체의 동작 정의 | Connection |
제공자 등록 API (provider registration API) | 제공자가 구현체를 등록할 때 사용 | DriverManager.registerDriver |
서비스 접근 API (service access API) | 클라이언트가 인스턴스 접근 시 사용 | DriverManager.getConnection |
서비스 제공자 인터페이스 (service provider interface) | 서비스 인터페이스의 인스턴스를 생성하는 팩터리 객체 (리플렉션으로 대체 가능) | Driver |
이름 | 설명 | 예시 |
---|---|---|
from | 하나의 매개변수에 대한 인스턴스를 반환하는 형변환 메서드 | Date d = Date.from(instant); |
of | 여러 매개변수를 받아 적당한 타입의 인스턴스를 반환하는 집계메서드 | Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING); |
value Of | from과 of의 더 자세한 버전 | BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE); |
instance / getInstance | 매개변수로 명시한 인스턴스 반환(같은 인스턴스임을 보장 x) | StackWalker luke = StackWalker.getInstance(options); |
create / newInstance | 매개변수에 대해 매번 새로운 인스턴스를 생성해 반환 | Object newArray = Array.newInstance(classObject, arrayLen); |
getType | getInstance와 동일하나, 다른 타입의 인스턴스를 반환할 때 사용 | FileStore fs = Files.getFileStore(path); |
newType | newInstance와 동일하나, 다른 타입의 인스턴스를 반환할 때 사용 | BufferedReader br = Files.newBufferedReader(path); |
type | getType과 newType의 간결한 버전 | List<Complaint> litany = Collections.list(legacyLitany); |
조슈아 블로크Joshua Bloch, 『이펙티브 자바 Effective Java 3/E』, 개앞맵시(이복연) 옮김, 인사이트(2018), p8-13.