ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • private 생성자를 사용하자
    카테고리 없음 2023. 4. 19. 09:55
    제목이 조금 이상하긴한데.. 모든 클래스에 해당되는 말은 당연히 아니다 우리가 흔히 쓰는 유틸 클래스 상태가 없는 클래스들을 말하는거다. 해당 클래스들은 모두 static 메소드를 이루어져 있다. 객체를 인스턴스할 필요가 없는 클래스들 이다. 흔히 유틸 클래스를 만들 때 인스턴스화를 막기 위해 클래스의 abstract 선언하곤 한다. abstract 선언해도 인스턴스를 생성 할 수 있다. 예를 들어 보자

    @Test public void test() { ReflectionClass reflectionClass = new ReflectionClass() { }; reflectionClass.printName("wonwoo"); } abstract class ReflectionClass { public ReflectionClass() { System.out.println("init"); } public static void printName(String name){ System.out.println(name); } }
    우리는 printName를 인스턴스화 해서 호출하였다. 물론 이 방법을 써도 컬리브레이스가 자동으로 생성되기 때문에 (툴에서) 알 수는 있다. 행여나 실수를 방지 하기 위해 가능하면 생성자를 private로 하자. 그러면 컴파일시 에러가 발생하므로 더 명확하다. 하지만 private를 생성자로 선언해도 접근가능하다. 코드를 보자.
    Class classes = ReflectionClass.class;
    Constructor constructor = classes.getDeclaredConstructor();
    constructor.setAccessible(true);
    Object o = constructor.newInstance();
    System.out.println(o);
    
    class ReflectionClass {
        private ReflectionClass() {
            System.out.println("init");
        }
    }
    
    우리는 다음과 같이 init을 출력하는걸 볼 수 있다. 그래서 우리는 다음과 같이 할 수 있다.
    class ReflectionClass {
        //no instance
        private ReflectionClass() {
            throw new AssertionError();
        }
    }
    
    물론 컴파일시에는 알 수는 없지만 런타임시에라도 에러를 발생 시키자. 그리고 따로 주석까지 남기는건 센스 어제 놀다가 늦게 들어갔는데 책이 와있었다. 피곤한 나머지 몇장 못보고 잤지만 대충 이런 내용인듯 싶다. 혹시나 다르다면 나중에 고쳐야지

    댓글

Designed by Tistory.