programing

Java: 하나의 파일에 여러 클래스 선언

copyandpastes 2022. 8. 23. 22:59
반응형

Java: 하나의 파일에 여러 클래스 선언

Java 에서는, 1개의 파일내에 복수의 톱 레벨 클래스를 정의할 수 있습니다.단, 그 중 1개가 퍼블릭인 경우(JLS © 7.6 참조).예를 들면, 이하를 참조해 주세요.

  1. 이 기술에 대한 깔끔한 이름이 있습니까(와 유사함)?inner,nested,anonymous

  2. JLS에 따르면 시스템은 이러한 세컨더리 클래스는 할 수 없는 제한을 적용할 수 있습니다.referred to by code in other compilation units of the package예를 들어 패키지 전용으로 취급할 수 없습니다.자바?

예: PublicClass.java:

package com.example.multiple;

public class PublicClass {
    PrivateImpl impl = new PrivateImpl();
}

class PrivateImpl {
    int implementationData;
}

Javac은 이를 적극적으로 금지하지는 않지만, 파일 이름과 동일한 이름을 가지지 않는 한 다른 파일의 최상위 클래스를 참조하고 싶지 않다는 제한이 있습니다.

를 들어,두의 파일이 있다고 가정해당 파일이 있다.Foo.java ★★★★★★★★★★★★★★★★★」Bar.java.

Foo.java★★★★

  • public class Foo

Bar.java★★★★

  • public class Bar
  • class Baz

또, 모든 클래스가 같은 패키지에 포함되어 있다고 합시다(또, 파일이 같은 디렉토리에 있습니다).

「 」의 경우는 ?Foo 가리키다Baz 아니다Bar요.Foo.java컴파일이 실패하고 다음과 같은 오류가 발생합니다.

Foo.java:2: cannot find symbol
symbol  : class Baz
location: class Foo
  private Baz baz;
          ^
1 error

생각해보면 이건 말이 돼요. ifFoo 가리키다Baz 아, 아, 아, 아, 아, 아, 아, 아, 게 없어요Baz.java (오류)Baz.classjavac은 검색 대상 소스 파일을 어떻게 알 수 있습니까?

대신 javac에게 컴파일을 지시하면Foo.java ★★★★★★★★★★★★★★★★★」Bar.java에 컴파일 되어 있던 「」를 .Bar.java ( ( )Baz.classjavac이 찾을 수 있는 곳) 또는FooBar에에 to in Baz을 사용하다그러나 이로 인해 빌드 프로세스가 매우 불안정하고 불안정하게 느껴집니다.

실제 제한은 "다른 파일의 최상위 클래스를 참조하지 않는 한 다른 파일의 최상위 클래스를 참조하지 마십시오."와 비슷합니다.따라서 일반적으로는 그 파일에 있는 파일과 이름이 같은 다른 클래스를 참조하지 않습니다.uh stricter) 각 파일에 최상위 클래스를 하나씩 넣는 관습입니다.만약 여러분이 수업이 공개되어야 하는지 말아야 하는지에 대한 생각을 바꾼다면 이것은 또한 더 좋다.

javac의 새로운 버전에서도 이 경우 다음과 같은 경고가 발생할 수 있습니다.-Xlint:all:

auxiliary class Baz in ./Bar.java should not be accessed from outside its own source file

때때로 모든 사람이 특정한 방법으로 무언가를 하는 데는 정말 그럴만한 이유가 있다.

이 기술(단일 소스 파일에 여러 최상위 클래스 포함)에 대해 제안하는 이름은 "mess"입니다.정말이지, 좋은 생각이 아닌 것 같아. 이 상황에서는 네스트 타입을 사용할 거야.그러면 파일이 어떤 소스 파일에 있는지 쉽게 예측할 수 있습니다.하지만 이 접근법에 대한 공식적인 용어가 있다고는 생각하지 않습니다.

실장간에 실제로 변경되는지에 대해서는, 매우 의심스럽지만, 처음부터 그것을 하지 않으면, 신경 쓸 필요가 없습니다.

전화하면 될 것 PrivateImpl a: a: anon-public top-level class. non-public top-level interfaces뿐만 아니라.

예: SO의 다른 부분: 공개되지 않은 최상위 클래스 vs 정적 중첩 클래스

버전 간의 동작 변경에 대해서는 1.2.2에서는 완벽하게 동작했지만 1.4에서는 동작하지 않는 에 대해 Sun의 포럼 Java 컴파일러에서는 파일에 공개되지 않은 최상위 클래스를 선언할 수 없다는 논의가 있었습니다.

이렇게 원하는 만큼 수업을 할 수 있다.

public class Fun {
    Fun() {
        System.out.println("Fun constructor");
    }
    void fun() {
        System.out.println("Fun mathod");
    }
    public static void main(String[] args) {
        Fun fu = new Fun();
        fu.fun();
        Fen fe = new Fen();
        fe.fen();
        Fin fi = new Fin();
        fi.fin();
        Fon fo = new Fon();
        fo.fon();
        Fan fa = new Fan();
        fa.fan();
        fa.run();
    }
}

class Fen {
    Fen() {
        System.out.println("fen construuctor");

    }
    void fen() {
        System.out.println("Fen method");
    }
}

class Fin {
    void fin() {
        System.out.println("Fin method");
    }
}

class Fon {
    void fon() {
        System.out.println("Fon method");
    } 
}

class Fan {
    void fan() {
        System.out.println("Fan method");
    }
    public void run() {
        System.out.println("run");
    }
}

1. 이 기술에 대해 깔끔한 이름(내부, 중첩, 익명)이 있습니까?

멀티클래스 싱글파일 데모

2. JLS는 시스템이 이러한 세컨더리 클래스를 패키지의 다른 컴파일 유닛에서 코드로 참조할 수 없는 제한을 적용할 수 있다고 말합니다.예를 들어, 이러한 세컨더리 클래스는 package-private로 취급할 수 없습니다.Java 구현 간에 실제로 변경되는 것입니까?

이러한 제한이 없는 컴파일러는 없습니다.모든 파일 기반 컴파일러는 클래스 이름과 동일한 이름의 파일 내의 소스 코드 클래스를 참조할 수 없습니다.(멀티 클래스 파일을 컴파일하여 클래스 패스에 클래스를 배치하면 컴파일러는 모두 해당 클래스를 찾습니다.)

참고로 Java 11+를 사용하는 경우 이 규칙에는 예외가 있습니다. Java 파일을 컴파일하지 않고 직접 실행하는 경우입니다.이 모드에서는 파일당 하나의 퍼블릭클래스에 대한 제한은 없습니다.단, 의 클래스는main첫 여야 합니다.

네, 외부 퍼블릭클래스의 퍼블릭스태틱 멤버를 사용하면 다음과 같이 할 수 있습니다.

public class Foo {

    public static class FooChild extends Z {
        String foo;
    }

    public static class ZeeChild extends Z {

    }

}

및 위의 내용을 참조하는 다른 파일:

public class Bar {

    public static void main(String[] args){

        Foo.FooChild f = new Foo.FooChild();
        System.out.println(f);

    }
}

같은 폴더에 넣어주세요.컴파일 대상:

javac folder/*.java

다음 항목과 함께 실행

 java -cp folder Bar

유효한 Java 제2판(항목 13)에 따르면:

「패키지 프라이빗 톱 레벨 클래스(또는 인터페이스)를 1개의 클래스만으로 사용하는 경우는, 톱 레벨 클래스를 그것을 사용하는 유일한 클래스의 프라이빗 네스트 클래스로 하는 것을 검토해 주세요(항목 22).이렇게 하면 패키지의 모든 클래스에서 패키지를 사용하는 하나의 클래스로 액세스하기 쉬워집니다.그러나 패키지-프라이빗 최상위 클래스보다 무료 공개 클래스의 접근성을 줄이는 것이 훨씬 더 중요합니다."

멤버 클래스가 인클로징인스턴스(항목 22)에 액세스 할 필요가 있는지 여부에 따라 네스트된 클래스는 스태틱 또는 비 스태틱으로 할 수 있습니다.

아니. 넌 하지 못할거야.그러나 Scala에서는 이것이 매우 가능합니다.

class Foo {val bar = "a"}
class Bar {val foo = "b"}

언급URL : https://stackoverflow.com/questions/2336692/java-multiple-class-declarations-in-one-file

반응형