[Effective Java] 아이템 4 : 인스턴스화를 막으려거든 Private 생성자를 사용해라
2022. 3. 14. 00:13ㆍJava/Effective Java
728x90
반응형
정적 메소드와 필드만 담는 클래스
- 곱게 보지 않지만 쓰인새는 존재하는 클래스들 -> Java.lang.Math, Java.util.Array & Collections
- Final 크래스와 관련한 메소드를 모아 놓을때도 사용 -> 하위 클래스에 넣는건 불가
예시로 라이브러리 Array의 코드 일부를 가져왔다.
public class Arrays
{
/**
* This class is non-instantiable.
*/
private Arrays()
{
}
- 생성자를 명시하지 않으면 컴파일러가 생성자를 자동으로 생성
- Public 생성자가 만들어진다. -> 사용자는 자동 생성이 되었는지 구분 불가
- 공개 API도 의도치 않게 인스턴스 될 수도 있다.
- 추상 클래스로 해도 상속시 무용지물이다.
Private 생성자를 추가한다면 컴파일러가 클래스의 인스턴스화 하는 것을 방어 가능하다
-> 상속이 불가한 효과를 지닌다.
public class Computer{
private Computer(){
throw new AssertionError();
}
}
public class Main{
public static void main(String[] args){
// 인스턴스화 할 수 없다.
Computer c = new Computer();
}
}
class에 private 생성자를 추가 함으로써 어디서든 접근이 불가능하게 된다.
단점
- 직관적이지 않다.
- 만약 사용시 다른 사람을 위해 주석 처리를 하여 설명을 덧 붙여야 한다.
728x90
반응형
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] 아이템 6 : 불필요한 객체 생성을 피하라 (0) | 2022.03.16 |
---|---|
[Effective Java] 아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.03.15 |
[Effective Java] 아이템 3 : private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2022.03.10 |
[Effective Java] 아이템 2 : 생성자에 매개변수가 많다면 빌더를 고려하라 (2) | 2022.03.08 |
[Effective Java] 아이템 1 : 생성자 대신 정적 팩토리 메소드를 고려하라 (0) | 2022.03.01 |