[Item1] Constructor 대신 Static Factory Method를 고려하라

Sera Lee·2022년 2월 21일
0

EffactiveJava

목록 보기
1/9
post-thumbnail

Static Factory Method란?

객체를 생성할 때 사용되는 기법 중 하나이다. Factory 이름에서 유추 할 수 있듯이 인스턴스를 생성하는 패턴인 팩토리 패턴 에서도 사용이 된다.

Spring에서는 주로 Layer 간 데이터를 Converting 할 때 사용되고 주로 of 라는 이름이 많이 사용이 된다.

💡 (be made) of 로 be made가 생략되어 사용된다.
A (be made) of B → `static A of(B)`

Static Factory Method 의 장점

1. 이름을 가질 수 있다.(객체 생성에 의미를 넣을 수 있다)

  • 이름을 가짐으로써 가독성을 높일 수 있다.

2. 생성자는 하나의 시그니처만 만들수 있고, 새로운 생성자를 만들려면 매개변수의 순서를 다르게 추가해야한다.

  • 매개변수를 다르게 생성자를 매번 추가해야하고,
  • 생성자를 썼을 때 매개변수가 굉장히 많은 경우,
    - 개발자의 실수가 높아진다(호출을 잘 못 할 수 있다)
    - 생성자 호출 시 어떤 매개변수의 값을 순서대로 써야하는지 헷깔린다.

3. 인스턴스를 매번 생성할 필요가 없다

  • 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다.
    - 논리적 동치성이 같은 객체가 여러번 객체 생성을 하게 된다.
  • 클래스 생성 통제가 가능하다(싱글톤)

4. 도메인레이어에서 Converting 코드줄이 제거되어, 보다 깨끗한 코드가 된다.

  • RequestDto → Entity → ResponseDto
	private Sting ModelName;
	private String companyId;

	public static ResponseLaptopDto from(Laptop laptop) {
		ResponseDto responseDto = new ResponseDto();
		responseDto.companyName = labtop.getCompanyName();
		responseDto.modelName = laptop.getModelname();
	}	

5. Interface 를 이용한 간단한 기능을 유지하는 Utility성 Interface를 만들 수 있다.

  • java9 이후에 생긴 기능
  • 예제 : Setof
 public interface StaticCalculator {
    public int plus(int i, int j);
    public int minus(int i, int j);

    public static int multiple(int i, int j){
        return i * j;
    }
}

################################################################

 public class CalculatorMain implements StaticCalculator {
    @Override
    public int plus(int i, int j) {
        return i+j;
    }

    @Override
    public int minus(int i, int j) {
        return i-j;
    }

    public static void main(String[] args) {
        Calculator calculator = new CalculatorMain();
        int staticMultipleValue = StaticCalculator.multiple(10, 20);
               System.out.println("staticMultipleValue = " + staticMultipleValue);
    }
}

6. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환 할 수 있다.

  • 매개변수에 따른 조건을 주어 각기 다른 하위클래스 객체를 반환해 줄 수 있다.
  • 예시 : EnumSet

0개의 댓글