본문 바로가기

독서찰기(讀書札記)/이펙티브 자바

[아이템 25] 톱레벨 클래스는 한 파일에 하나만 담으라

[Why]

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

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

// 두 클래스가 한 파일(Utensil.java)에 정의되었다.
public class Main {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
}
  • Main을 실행하면 pancake를 출력한다.
class Utensil {
    static final String NAME = "pot";
}

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

// 두 클래스가 한 파일(Dessert.java)에 정의되었다.
  1. javac Main.java / javac Main.java Utensil.java 명령: Dessert.java 파일을 작성하기 전처럼 pancake를 출력
  2. javac Dessert.java Main.java 명령: potpie 출력
  3. javac Main.java Dessert.java 명령: 컴파일 오류(Utensil, Dessert 클래스 중복 정의)

어느 소스 파일을 먼저 컴파일하냐에 따라 어느 것을 사용할 지가 달라진다.

 

[How]

  • 톱레벨 클래스들(Utensil과 Dessert)을 서로 다른 소스 파일로 분리하면 된다.
  • 굳이 한 파일에 담고 싶으면 정적 멤버 클래스(아이템24)를 사용하는 방법을 고민해볼 수 있다.
public class Test {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
    
    private static class Utensil {
        static fianl String NAME = "pan";
    }
    
    private static class Dessert {
        static final String NAME = "cake";
    }
}