[effective java] (1) 생성자 대신 정적 팩터리 메서드를 고려하라

orca·2022년 10월 27일
0

effective java

목록 보기
1/8

자바의 본질을 실무에 적용하는 이펙티브 자바 강의를 듣고 정리한 내용입니다

대상 클래스 내부에서 어떻게 구현될까?

public class Laptop {
    private Long id;
    private String model;
    private String company;
}

생성자의 예시

public Laptop(String model, String company) {
        this.model = model;
        this.company = company;
    }

정적 팩터리 메서드의 예시

public static Laptop ofModelAndCompany(String model, String company){
        Laptop laptop = new Laptop();
        laptop.company = company;
        laptop.model = model;
        return laptop;
    }

객체 인스턴스 생성 예시 for Entity

생성자를 사용한 객체 인스턴스 생성

변수를 다 명시해서 인스턴스를 생성해야함
💬 변수가 늘어나면 상당히 비효율적일 것이다

public Laptop(String model, String company) {
        this.model = model;
        this.company = company;
    }
@PostMapping("/add")
    public Laptop addLaptop(@RequestBody LaptopForm laptopForm){
        Laptop laptop = new Laptop(laptopForm.getName(), laptopForm.getCorp());

    }

정적 팩터리 메서드를 사용한 객체 인스턴스 생성

한 줄이면 충분하고 가독성이 좋음

 public static Laptop from(LaptopForm laptopForm){
        Laptop laptop = new Laptop();
        laptop.model = laptopForm.getName();
        laptop.company = laptopForm.getCorp();
        return laptop;
    }
@PostMapping("/add")
    public Laptop addLaptop(@RequestBody LaptopForm laptopForm){
        Laptop laptop = Laptop.from(laptopForm);
        return laptop;
    }

정적 팩터리 메서드 사용 예시 in Dto

필요하지 않은 엔티티의 속성을 제거하고 Dto를 생성하는 루틴으로도 매우 유용함

public class LaptopDto {
    private String modelName;
    private String companyName;

    public static LaptopDto from(Laptop laptop){
        LaptopDto laptopDto = new LaptopDto();
        laptopDto.companyName = laptop.getCompany();
        laptopDto.modelName = laptop.getModel();
        return laptopDto;
    }
}

정적 팩터리 메서드의 장단점

장점

1.이름을 가질 수 있다.
생성자에서는 인자의 순서를 나열할 수 없지만, 이름을 가질 수 있는 정적 팩터리 메서드는 어떤 인자가 어떤 순서로 들어가야 하는지 아래와 같이 명시 가능함!

public static Laptop ofModelAndCompany(String model, String company){
        Laptop laptop = new Laptop();
        laptop.company = company;
        laptop.model = model;
        return laptop;
    }

2.호출될때마다 인스턴스를 새로 생성할 필요가 없다.
3.유연성이 좋다.
만약 ofParam으로 Type Enum을 받는다면, Type에 따라 Laptop 엔티티를 달리 반환 가능함

 public static Laptop ofCompanyEnum(LaptopForm laptopForm, CompanyEnum companyEnum){
        Laptop laptop = new Laptop();
        if(companyEnum==CompanyEnum.APPLE){
            laptop.model = laptopForm.getName();
            laptop.company = laptopForm.getCorp();
        }
        else if(companyEnum==CompanyEnum.SAMSUNG){
            laptop.model = laptopForm.getName();
        }
        return laptop;
    }

0개의 댓글