본문 바로가기

프로그래밍/자바(java)

[이펙티브 자바] 객체의 생성과 파괴

1. Constructor와 static Factory method의 비교

 

 

 

생성자는 저희가 흔히 알고 있는 방식이 Movie에 있는 값들을 받아 생성하는 식으로 많이 사용한다.

 

 

 

 

static Factory method 방식은 빈 생성자를 만든 후,  return 을 해주는 방식을 말하고 있다.

그런데 이게 좋은건가? 라는 생각을 하게 된다.

 

약간 예제로 설명하게 되면다면, 밑에 같은 상황으로 사용할수 있을것같다.

 

 

 

 

API 에서 받은 Reqeust Parameter 값을 원하는 값으로 변환시킬수 있다.

또한, 파라미터가 한개면 from으로 두개 이상이면 of로 표현한다.

 

 

static Factory metho를 사용하면 장점들이 있다.

 

1. 이름을 가질수 있다.

2. Simple하고 명확하게 사용할 수 있다.

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

 

단점으로는 생성자가 없을 수 있어 상속받은 class를 만들수 없으며, 프로그래머가 인지가 잘 안될 수 있다.

 

 

 

2. 많은 파리미터가 있는 경우 생성자를 builder를 고려하라

 

 

여러개 데이터를 저장하는경우, 생성자를 생성해 넣게 되면 어느 위치에 있는지 헷갈리게 되고 실수할 확률이 높아진다.

 

여기서 Builder를 사용하지 않고 해결 방법은 두개가 있다.

생성자를 필요에따라 만든후 사용하는 방법이 있고, Setter를 사용하는 경우가 있다.

생성자가 많으면 오히려 데이터가 더 추가되는경우 로직이 어려워지는 문제점이 있고, Setter에 경우에는 Entity에서는 Setter를 하게 되면 데이터가 변경되는 장점이자 단점이 있어 지양하는 편이 있다.

 

 

 

lombok이라는 라이브러리를 이용하면 Builder를 쉽게 사용할 수 있다.

넣어줄 변수에 넣을 수 있다는 장점이 있고, lombok에서 지원하는 기능중에는 default값을 지정할 수 있어 생성자의 파라미터가 많으면 많을 수록 더 좋은 패턴이다.

 

builder에서 단점은 builder를 만드는데 생성 비용이 무조건 생기게 된다.

점층적 생성자 패턴 보다 장황하게 적은 갯수의 parameter일 경우 오히려 좋지 않을 수 있다.

 

 

3. private contructor나 enum type으로 singleton임을 보장하라.

 

 

INSTANCE가 초기화 되고 나면 고장이 된다.

instance는 대문자로 사용했는데 변하지 않기 때문에 대문자로 사용을 한다.

 

 

첫번째 방식과 다른게 getInstace가 추가가 된 부분이 보인다.

캡슐화를 통해 반환하는게 따로 나태는주는게 변형을 줄수있는 부분도 있어 더 좋다.

 

 

 

상황에 따라 synchronized나, lazy하게 instance를 생성하는 방법이다.

JDBC를 사용하는경우 사용하지 않으면 끊어놓으면 다시 연결하는 형식으로 도 사용할 수 있고, synchronized를 사용하여 쓰레드환경에서도 사용할 수 있도록 할 수 있다.

 

 

Enum Type으로 Singleton Pattern을 사용할 수 있다.

 

 

INSTACE를 다시 불러와도 Setter되었던 값이 초기화 되지 않고 유지되는 모습을 볼 수 있다.

직렬화나 리플렉션 공격을 방지할 수 있다는 장점이 있다.

하지만, 보기에 많이 보기 어려울수 있다는 단점이 있다.

 

 

4. Instace화를 막으려면 private constructor를 사용하라.

 

staitc으로 만든 utils은 인스턴스를 막지 위해 privte 로 constructor를 사용하여 생성자 막자.

일반적으로 utils class 관용적으로 instance화를 하지 않을 거라고 모두가 이미 알고 있는 경우는 생략하기도 한다.

 

 

5. Resource를 직접 명시하지 말고, Dependency injection을 사용하라.

 

 

config에 등록된 bean이 하나 있다.

근데 만약에 server가 dev, prod가 있으면 SERVER라는 값이 localhost가 맞을까? 라는 생각이 든다.

 

 

 

 

properties에 등록된 파일을 가져와서 상황별로 값을 변경하여 사용이 가능하다.

 

Contructor injection의 경우는 flexibility를 높일 수 있기떄문에 고정된 값에 비해 훨씬 유연한 class가 된다.

test code작성시 injection 하기도 편리하다.