-
이펙티브 자바 - ITEM1⏰ 오늘의 공부/Java 2022. 1. 5. 01:17
Constructor 대신 Static Factory Method 를 고려하라
Constructor
public static class Laptop { private String model; private String company; public Laptop(String model, String company) { this.company = company; this.model = model; } }
Static Factory Method = 객체 생성의 역할을 하는 메서드
public static class Laptop { private String model; private String company; } // 네이밍 룰 // from~ = 매개변수 하나인 메서드 // of~ = 매개변수가 N개인 메서드 public static Laptop ofModelNameAndCompany(String modelName, String company) { Laptop laptop = new Laptop(); laptop.company = company; laptop.model = modelName; return laptop; }
왜 Static Factory Method를 써야하는가 ?
- 이름을 가질 수 있다.
- 정적 팩토리 메서드를 사용하면 메서드 이름에 객체의 생성 목적을 담아 낼 수 있다.
- 객체는 생성 목적과 과정에 따라 생성자를 구별해서 사용할 필요가 있다.
- 호출할 때마다 새로운 객체를 생성할 필요가 없다.
- 불편 클래스의 경우 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 불필요한 객체 생성을 피한다.
- 정적 팩토리 메소드를 사용하면 언제 어느 인스턴스를 살아 있게 할지 통제할 수 있다.
- 클래스를 싱글톤으로 만들 수 있다.
- 인스턴스화 불가로 만들 수 있다.
- 불변 값 클래스에서 레퍼런스 값이 같음을 보장할 수 있다. (a == b)
- 인스턴스 통제는 플라이웨이트 패턴의 근간이 됨
참고: 플라이웨이트 패턴 ?
데이터를 공유하여 메모리를 절약하는 패턴
공통으로 사용되는 객체는 한번만 사용되고 Pool에 의해서 관리, 사용된다.
- 하위 자료형 객체를 반환할 수 있다.
- 하위 자료형 객체를 반환하는 정적 팩토리 메서드의 특징은 상속을 사용할 때 확인할 수 있다.
- 생성자의 역할을 하는 정적 팩토리 메서드가 반환값을 가지고 있기 때문에 가능한 특징
ex) Basic, Intermediate, Advanced 클래스가 Level라는 상위 클래스를 상속받고 있는 구조일 때
public class Level { ... public static Level of(int score) { if (score < 50) return new Basic(); else if (score < 80) return new Intermediate(); else return new Advanced(); } ... }
- 객체 생성을 캡슐화할 수 있다.
- ex) API request 를 가정
public static class LaptopForm { private String model; private String company; }
@PostMapping(value = "/add") public LaptopDto addLaptop(@RequestBody LaptopFrom laptopFrom) { }
public static class Laptop { private Long id; private String model; private String company; } public static Laptop from(LaptopForm laptopForm) { Laptop laptop = new Laptop(); laptop.company = laptopForm.getCompany(); laptop.model = laptopForm.getModel(); return laptop; }
정적 팩토리 메서드를 사용하여 내부 구현을 모르더라도 DTO ↔ Entity를 쉽게 변환할 수 있다.
Laptop laptop = Laptop.from(laptopForm); // 정적 팩토리 메서드를 쓴 경우 Laptop laptop = new Laptop(laptopForm.getModel(), laptopForm.getCompany()); // 생성자를 쓴 경우
- ex) API request 를 가정
- 실제 구현체 클래스가 없어도 된다.
'⏰ 오늘의 공부 > Java' 카테고리의 다른 글
이펙티브 자바 - ITEM2 (0) 2022.01.05 - 이름을 가질 수 있다.