핵심: 객체를 만들 때부터 그 용도나 상태를 지정해주는 것
원래였던 것
User user = new User("한솔",20);
정적 팩터리 메서드
User guest = User.guest(); // 비회원 상태로 초기화된 객체
User admin = User.admin(); // 관리자 권한을 가진 객체
정적 팩토리 메서드 원칙
1. static 키워드 사용
2. 내부에서 new로 객체 생성 후 반환
3. 메서드명이 의미를 설명함
4. 타입 매개변수<T>지원 (제네릭)
public static <T> 반환타입 메서드명(매개변수들) {
return new 생성자호출(매개변수);
}
public static <T> ApiResponse<T> of(T data) {
return new ApiResponse<>(data);
}
public static <- 정적이라 객체 없이 호출이 가능하다(ApiResponse.OK() 형태)
return new AipResponse<>() <- factory 역할(객체를 만들어서 반환)
즉 생성자를 감싸서 좀 더 명확한 이름과 제어를 부여한 형태
요약하자면
정적 팩토리 메서드는 객체 생성을 대신 수행하는 정적(static)메서드다.
생성자보다 의미 있는 이름을 줄 수 있고 캐싱이나 싱글톤 처리 등 객체 생성을 통제하기에 좋다.
지금 코드의 OK()와 fail()이 그 예시다.
예시 코드
public class User{
private String name;
private String role;
private User(String name, String role){
this.name=name;
this.role=role;
}
// 정적 팩터리 메서드
public static User guest(){
return new User("GUEST","GUEST");
}
public static User admin(){
return new User("ADMIN","ADMIN");
}
public static User of(String name){ // static은 객체 없이도 호출이 가능하다는 점.
return new User(name,"USER"); //User.of("한솔")이렇게 클래스 이름으로 바로 호출이 가능하다. 생성자처럼 new 안 써도 됨
// of: ~로부터 객체를 만들어낸다.
// 즉 User객체를 만들어서 돌려주겠다는 뜻
// 표준 라이브러리에서도 많이 씀
// List.of(), Optional.of() 등
}
}
사용 시
User u1 = User.guest(); // 이미 게스트 상태로 만들어짐
User u2 = User.admin(); // 이미 관리자 상태로 만들어짐