자바에서 객체를 생성하는데 여러가지 방법이 있다. 기본인 생성자부터 빌더 정적 팩토리.. 왜 어떨때 사용하는걸까?
토론해보면 재밌을 것 같다.
"정답은 없다." 어떤 방법을 사용하던지 장단점이 있기 때문에 본인의 상황에 맞게 적절히 선택하여 사용하면 된다.
장단점을 알아보자.
생성자는 인스턴스가 생성될 때 한 번 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다.
"다양한 객체 생성 방식에 대응할 수 없다." 라는 단점 때문에 점층적 생성자 패턴을 사용하기도 한다.
빌더 패턴은 각 메서드 호출은 빌더 객체 자신을 반환하므로, 이후에 다른 메서드를 계속해서 호출할 수 있다.
생성자 대신 정적 메서드를 사용하여 객체를 생성하고 반환하는 패턴이다.
유연성, 가독성등 의 많은 사람이 빌더패턴을 권장한다. 나의 생각은 조금 다르다.
빌더의 장점은 유연성과 가독성인데 지금까지 개발을 하면서 유연한 생성이 필요한 객체가 그렇게 많지 않았다.
또한 필드에 null이 들어가는 객체는 엔티티의 id를 제외하고 있지 않았기에 빌더 패턴의 장점인 유연성은 오히려 실수를 낳을 여지라고 생각했다.
또한 IDE 에서 매개변수로 어떤게 들어가는지 모두 알려주기 때문에 생성자를 사용하며 불편함은 없었다.
객체 캐싱은 동일한 매개변수로 객체를 반복해서 생성하는 경우, 이미 생성된 객체를 캐시에 저장하고 재사용함으로써 성능을 향상시킬 수 있다.
캐싱은 주로 불변 객체에서 사용되며, 객체를 생성하는 데 비용이 많이 드는 경우에 특히 유용하다.
실제로 Integer의 valueOf() 메서드에서 -128 ~ 127 까지의 값을 캐싱해 사용하고 있는데, 이런 특수한 상황을 제외하면 사용할 수 없다.
본인은 위와 같은 이유로 빌더와 정적 팩토리의 장점을 크게 못느껴 생성자로 객체를 생성하는 방법이 대체로 좋다고 생각한다.
IDE에서 매개변수 힌트를 주고, 빌더 패턴을 사용하며 코드가 많아지고, 실수의 여지도 생기니 말이다.