티스토리 뷰
(Effective Java) 규칙4. 인스턴스화를 막으려거든 private 생성자를 사용하라
유틸리티 클래스
-
정적 메서드나 필드만 모은 클래스를 만들고 싶을 때가 있음 (악명이 높지만 분명 필요할 때가 있음)
-
자바의 기본 자료형 값 (primitive value) 또는 배열에 적용되는 메서드를 한군데 모아둘 때 유용 (예. java.lang.Math, java.util.Arrays)
-
특정 인터페이스를 구현하는 객체를 만드는 팩터리 메서드 등의 정적 메서드를 모아놓을 때도 유용 (예. java.util.Collections)
-
final 클래스에 적용할 메서드들을 모아놓을 때도 활용
-
문제
-
이런 유틸리티(Utility) 클래스는 객체를 만들 목적의 클래스가 아님
- 그러나 생성자를 생략하면 컴파일러는 자동으로 인자 없는 public 기본 생성자 (default constructor)를 만들어 버림
- 일반 생성자와 구별할 수 없고, 공개 API에 포함되는 일도 드물지 않음
-
abstract로 선언해 봤자 소용이 없음
- 하위 클래스를 만드는 순간 객체 생성이 가능해지기 때문
해결 방법
-
private 생성자를 클래스에 넣어서 객체 생성을 방지하는 것
//객체를 만들 수 없는 유틸리티 클래스 public class UtilityClass { //기본 생성자가 자동 생성되지 못하도록 하여 객체 생성 방지 private UtilityClass() { throws new AssertionError(); } }
- 클래스 외부에서는 생성자를 사용할 수 없음
- AssertionError는 반드시 필요하진 않지만, 클래스 안에서 실수로 생성자를 호출하면 알 수 있도록 한 것
- 이렇게 하면 하위 클래스 또한 만들 수 없다.
- (간단하지만 매우 중요..)
끝으로
이 글이 도움이 되었다면, Google 광고 한번씩 클릭 부탁 드립니다. 🙏🙏🙏
광고 클릭은 많은 힘이 됩니다!
반응형
'프로그래밍 > EffectiveJava' 카테고리의 다른 글
(이펙티브 자바) 규칙18. 상속보다는 컴포지션을 사용하라 (0) | 2020.02.13 |
---|---|
(이펙티브 자바) 규칙 1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2020.02.11 |
(이펙티브 자바) 규칙6. 불필요한 객체 생성을 피하라 (0) | 2020.02.10 |
(이펙티브 자바) 규칙3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2020.02.06 |
(이펙티브 자바) 규칙53. null 대신 빈 배열이나 컬렉션을 사용하라 (0) | 2020.02.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- JavaFX Window Close
- TableView
- JavaFX Table View
- 인텔리제이
- 자전거
- java
- springboot
- 일본 자전거 여행
- 이펙티브
- 자바
- Java UI
- 이펙티브자바
- 이펙티브 자바
- 일본 배낭여행
- JavaFX 테이블뷰
- 일본여행
- 텐트
- effective java
- 방통대 과제물
- 배낭 여행
- git
- 자전거 여행
- intelij
- effectivejava
- windows
- JavaFX
- 일본 여행
- JavaFX 종료
- 배낭여행
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함