Skip to content

Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라. #2

@lain1nya

Description

@lain1nya

Chapter : 2. 객체 생성과 파괴

Item : 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

Assignee : Lainlnya


🍑 서론

정적 메서드와 정적 필드 만을 담은 클래스를 만들고 싶다고 가정해보자.

🍑 본론

✅ 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어서 쓰려고 설계한 것이 아니다.
✅ 매개변수를 받지 않는 public 생성자가 만들어지며, 사용자는 생성자가 자동생성된 것인지 구분할 수 없다.

인스턴스화를 막을 수 있는 방법

✅ 추상 클래스로 만드는 것으로는 인스턴스 화를 막을 수 없다. => 사용자가 상속해서 쓰라는 것으로 오해의 여지가 있다.
✅ private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다.

    public class UtilityClass {
        // 기본 생성자가 만들어지는 것을 막는다. (인스턴스 방지용)
        private UtilityClass() {
            throw new AssertionError();
        }
    }
  1. 명시적으로 Private를 사용해 클래스 바깥에서 접근할 수 없고, AssertionError를 통해 클래스 안에서라도 실수로 호출되지 않도록 해준다.
  2. 상속을 불가능하게 한다. 하위 클래스가 상위 클래스의 생성자에 접근할 수 없기 때문이다.

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions