728x90
객체의 생성과 파괴 Item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
필수 매개변수와 선택 매개변수
다음은 클래스 Dog에 담겨져 있는 정보들이다.
타입 | 이름 | 설명 | 구분 |
String | name | 이름 | 필수 |
int | age | 나이 | 필수 |
String | kind | 종 | 선택 |
int | weight | 무게 | 선택 |
위 테이블에는 당장 필요한 정보, 당장 필요 없는 정보가 있다.
하지만 급하지 않은 정보 때문에 객체 생성을 못하고 있는건 낭비같다.
만약 이 모든 조합을 생성자로 생성하면 생성자 메서드만 엄청 많아질 것이다.
자바빈즈 패턴
public class Dog
{
String name;
int age;
String kind;
int weight;
// Setter
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
this.age = age;
}
public void setKind(String kind)
{
this.kind = kind;
}
public void setWeight(int weight)
{
this.weight = weight;
}
}
public class Application
{
public static void main(String[] args)
{
Dog dog = new Dog();
dog.setName("월월이");
dog.setAge(2);
dog.setKind("치와와");
dog.setWeight(3);
}
}
이 코드는 위에 엄청 많아질 생성자 코드보다는 훨씬 깔끔하다.
하지만 이 코드는 객체 하나를 생성하는데 이렇게 많은 메서드를 호출해야 한다.
빌더 패턴
public class Dog
{
String name;
int age;
String kind;
int weight;
public static class Builder
{
// 필수 매개변수
private final String name;
private final int age;
// 선택 매개변수 - 기본값으로 초기화한다.
private String kind = "똥개";
private int weight = 0;
public Builder(String name, int age)
{
this.name = name;
this.age = age;
}
public Builder kind(String val)
{
kind = val;
return this;
}
public Builder weight(int val)
{
weight = val;
return this;
}
public Dog build() {
return new Dog(this);
}
}
private Dog(Builder builder)
{
name = builder.name;
age = builder.age;
kind = builder.kind;
weight = builder.weight;
}
}
public class Application
{
public static void main(String[] args)
{
Dog dog = new Dog()
.Builder("애옹이", 3)
.kind("치와와")
.weight(4)
.build();
}
}
위 코드는 빌더 패턴이다.
빌더 패턴은 내부의 Builder클래스를 작성해서 객체를 생성한다.
장점
- 점층적 생성자 패턴처럼 객체 안정성이 있다.
- 자바 빈즈 패턴처럼 코드 가독성이 좋고 유연하다.
단점
- 빌더에 대한 코드를 따로 작성해야 한다.
- 매개변수가 4개 이상일 때 그 효과가 좋다.
728x90
'EFFECTIVE JAVA' 카테고리의 다른 글
EFFECTIVE JAVA TIL 06 - 객체 생성과 파괴 / 아이템 6 (0) | 2024.07.25 |
---|---|
EFFECTIVE JAVA TIL 05 - 객체 생성과 파괴 / 아이템 5 (0) | 2024.07.25 |
EFFECTIVE JAVA TIL 04 - 객체 생성과 파괴 / 아이템 4 (0) | 2024.07.24 |
EFFECTIVE JAVA TIL 03 - 객체 생성과 파괴 / 아이템 3 (0) | 2024.07.24 |
EFFECTIVE JAVA TIL 01 - 객체 생성과 파괴 / 아이템 1 (1) | 2024.07.24 |