-
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를 활용하자.
'독서 > Effective Java' 카테고리의 다른 글
Item 27: Eliminate unchecked warnings (0) 2022.01.02 Item 26: Don’t use raw types (0) 2021.12.28 Item 24: Favor static member classes over nonstatic (0) 2021.12.26 Item 23: Prefer class hierarchies to tagged classes (0) 2021.12.26 Item 22: Use interfaces only to define types (0) 2021.12.26