ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Item 25: Limit source files to a single top-level class
    독서/Effective Java 2021. 12. 26. 16:20

    톱레벨 클래스는 한 파일에 하나만 담으라

     

    소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 컴파일은 잘 수행된다.

    다음은 Utensil.java 클래스 코드이다.

    class Utensil {
      static final String NAME = "pan";
    }
    
    class Dessert {
      static final String NAME = "cake";
    }

     

    실제 사용 시 main method는 컴파일, 실행이 문제 없이 된다. 

    public class Main {
      public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
      }
    }
    
    // result
    pancake

    근데 같은 클래스들을 정의하는 Dessert.java라는 파일을 컴파일이 문제없이 돌아갈 수 있다. 

     

    class Utensil {
      static final String NAME = "pot";
    }
    
    class Dessert {
      static final String NAME = "pie";
    }

     

    문제

    운좋게 컴파일 단계에서 중복 에러가 나온다면 참 좋겠지만 그렇지 않은 경우도 존재한다.

    item25> javac -d . .\Main.java .\Dessert.java
    item25> java Main
    potpie
    item25> javac -d . .\Main.java
    item25> java Main
    potpie
    item25> javac -d . .\Main.java .\Utensil.java
    item25> java Main
    pancake
    item25> javac -d . .\Main.java
    item25> java Main
    pancake

    컴파일 순서를 다르게 줄 경우 매번 바뀌는 참혹한 상황이 나오게 된다.

     

    해결책

    • 톱 레벨 클래스를 분리한다.
    • 정적 멤버 클래스(Item 24)를 사용한다.
      • private로 선언해 접근 범위를 더 줄일 수 있다!
    // Static member classes instead of multiple top-level classes
    public class Test {
        public static void main(String[] args) {
            System.out.println(Utensil.NAME + Dessert.NAME);
        }
        private static class Utensil {
            static final String NAME = "pan";
        }
        private static class Dessert {
            static final String NAME = "cake";
        }
    }

    정리

    소스 파일 하나에는 반드시 톱레벨 클래스(인터페이스) 하나만 담자.  

     

    참고

    IDE로 개발할 경우 이러한 문제는 이미 컴파일 단계에서 확인할 수 있다.

    그러니 IDE를 활용하자.

    댓글

Designed by Tistory.