-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Labels
🐳 02 Objects2장 객체 생성과 파괴2장 객체 생성과 파괴
Description
Chapter : 2. 객체 생성과 파괴
Item : 4. 인스턴스화를 막으려거든 private 생성자를 사용하라
Assignee : Lainlnya
🍑 서론
정적 메서드와 정적 필드 만을 담은 클래스를 만들고 싶다고 가정해보자.
🍑 본론
✅ 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어서 쓰려고 설계한 것이 아니다.
✅ 매개변수를 받지 않는 public 생성자가 만들어지며, 사용자는 생성자가 자동생성된 것인지 구분할 수 없다.
인스턴스화를 막을 수 있는 방법
✅ 추상 클래스로 만드는 것으로는 인스턴스 화를 막을 수 없다. => 사용자가 상속해서 쓰라는 것으로 오해의 여지가 있다.
✅ private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다.
public class UtilityClass {
// 기본 생성자가 만들어지는 것을 막는다. (인스턴스 방지용)
private UtilityClass() {
throw new AssertionError();
}
}- 명시적으로 Private를 사용해 클래스 바깥에서 접근할 수 없고, AssertionError를 통해 클래스 안에서라도 실수로 호출되지 않도록 해준다.
- 상속을 불가능하게 한다. 하위 클래스가 상위 클래스의 생성자에 접근할 수 없기 때문이다.
java.lang.Math 의 예시
private로 만든 후 주석을 통해 명시적으로 표시해주고 있다.
public final class Math {
/**
* Don't let anyone instantiate this class.
*/
private Math() {
}
}java.util.Arrays 의 예시
public class Arrays {
// Suppresses default constructor, ensuring non-instantiability.
private Arrays() {
}
}java.util.Collections 의 예시
특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓았다.
List, Set, Map 등의 컬렉션 인터페이스를 구현하는 객체를 생성한다.
public class Collections {
// Suppresses default constructor, ensuring non-instantiability.
private Collections() {
}
}테스트
public class test {
private test() {
}
}public class testFrom {
// 'test()' has private access in 'com.ssafy.springtest.model.dao.test'
test newTest = new test();
}// There is no default constructor available
public class testFrom extends test {
}🍑 결론
인스턴스화를 막으려거든 private 생성자를 사용하라
Referenced by
- Effective Java P26~27
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
🐳 02 Objects2장 객체 생성과 파괴2장 객체 생성과 파괴