자바의 본질을 실무에 적용하는 이펙티브 자바 강의를 듣고 정리한 내용입니다
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;
}
변수를 다 명시해서 인스턴스를 생성해야함
💬 변수가 늘어나면 상당히 비효율적일 것이다
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;
}
필요하지 않은 엔티티의 속성을 제거하고 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;
}