Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 투 포인터
- mst
- CS
- 시뮬레이션
- 유니온 파인드
- 이분탐색
- java
- 스택
- 백트래킹
- dfs
- 후니의 쉽게 쓴 시스코 네트워킹
- 위상정렬
- Network
- 완전탐색
- 에라토스테네스의 체
- 세그먼트 트리
- 동적계획법
- JUnit 5
- 플로이드-와샬
- 구현
- 수학
- BFS
- Kotlin
- 프로그래머스
- swea
- 그리디
- 알고리즘
- Effective Java
- 문자열
- 백준
Archives
반갑습니다!
[Effective Java] 아이템 4: 인스턴스화를 막으려거든 private 생성자를 사용하라 본문
- 단순히 정적 메서드와 정적 필드만을 담은 클래스가 필요할 때가 있다
- ex)
java.lang.Math
,java.util.Arrays
- 기본 타입 값, 배열 관련 메서드들이 모여있음
- ex)
java.util.Collections
- 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리)를 모아놓을 수 있음
- final 클래스와 관련한 메서드들을 모아놓을 수 있음
- final 클래스는 상속이 불가능하므로 하위 클래스에 메서드를 넣는 건 불가능
- ex)
인스턴스화를 막는 방법
- 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 사용하려고 설계된 것이 아니다
- 생성자를 명시해주지 않으면 컴파일러가 자동으로 생성자를 만들어주므로 의도치 않게 인스턴스화 가능할 수 있음
- 유틸리티 클래스를 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없음
- 하위 클래스를 만들어 인스턴스화 할 수 있음
- 사용자가 상속해서 사용하는 것으로 오해할 수 있음
private
생성자를 추가하면 클래스의 인스턴스화를 막을 수 있음- 컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 때 뿐
- 명시적 생성자가
private
이므로 클래스 바깥에서 접근할 수 없음
public class UtilityClass {
// 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용).
private UtilityClass() {
throw new AssertionError();
}
... // 나머지 코드 생략
}
- 위 코드는 어떤 환경에서도 클래스가 인스턴스화 되는 것을 막아줌
- 생성자가 존재하는데 호출할 수 없다는 것은 직관적이지 않으므로 적절한 주석을 달아주면 좋음
- 상속을 불가능하게 하는 효과도 있음
- 모든 생성자는 상위 클래스의 생성자를 호출해야하므로, 하위 클래스에서 상위 클래스의 생성자에 접근할 방법이 없기 때문
'개발' 카테고리의 다른 글
[Effective Java] 아이템 6: 불필요한 객체 생성을 피하라 (0) | 2021.07.25 |
---|---|
[Effective Java] 아이템 5: 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2021.07.25 |
[Effective Java] 아이템 3: private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2021.07.23 |
[Effective Java] 아이템 2: 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2021.07.22 |
[Effective Java] 아이템 1: 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2021.07.22 |