티스토리 뷰
프로그래밍/Effective Java
[Effective Java] 03. private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하라.
Reference M1 2019. 3. 9. 23:43Singleton
싱글턴은 객체를 하나만 만들 수 있는 클래스다.
싱글턴을 구현하는 흔히 사용하는 방법 두가지는 다음과 같다.
생성자를 private로 선언하고 public static final로 선언한 필드 변수에 인스턴스 저장
생성자를 private로 선언하고 public statc ClassType getInstance() { return INSTANCE;}
public class Elvis { private static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public static Elvis getInstance() { return INSTANCE; } public void leaveTheBuilding() { ... } }
위 코드는 싱글턴 패턴의 한 예이다.
주의할점은 싱글턴 클래스를 직렬화 가능 클래스로 만들려면 클래스 선언에 implements Serializable을 추가하는 것으로는 부족하다. 싱글턴 특성을 유지하려면 모든 필드를 transient 선언하고 readResolve 메서드를 추가해야 한다. 그렇지 않으면 serialize된 객체가 역직렬화(deserialize)될 때마다 새로운 객체가 생성된는 문제점이 있다.
또 하나 주의할 점은 리플렉션(reflection)을 통해 private 생성자 권한을 뚫어 객체를 생성하는 공격을 막을 수 없다.
위 두가지 문제를 해결할 수 있는 방법은 원소가 하나뿐인 enum 클래스를 이용하여 싱글턴 패턴을 구현하는 것이다.
public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } }
위 방법은 JDK 1.5부터 사용이 가능하다. 이 접근법은 직렬화가 아무리 복잡하게 이루어져도 여러 객체가 생길 일이 없으며, 리플렉션(reflection)을 통한 공격에도 안전하다.
'프로그래밍 > Effective Java' 카테고리의 다른 글
[Effective Java] 06. 유효기간이 지난 객체 참조는 폐기하라. (0) | 2019.04.21 |
---|---|
[Effective Java] 05. 불필요한 객체는 만들지 마라. (0) | 2019.03.26 |
[Effective Java] 04. 객체 생성을 막을 때는 private 생성자를 사용하라. (0) | 2019.03.10 |
[Effective Java] 02. 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라. (0) | 2019.03.01 |
[Effective Java] 01. 생성자 대신 정적 팩터리 메서드를 사용할 수 없는지 생각해 보라. (0) | 2019.02.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
TAG
- Eclipse
- javascript
- effective java
- 정렬 알고리즘
- 리액트
- 리눅스 명령어
- Java
- SQL
- 오라클 내장 함수
- 제주도 여행
- sort algorithm
- Linux 명령어
- 소프트웨어공학
- 회고
- 리액트 16
- 프로그래머
- 개발환경
- 경력관리
- React
- 오라클
- spring
- Collection
- 이직
- 제주도 3박4일 일정
- Tomcat
- 자바
- 자바스크립트
- 성능분석
- 프로그래머스
- Maven
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함