Java: 하나의 파일에 여러 클래스 선언
Java 에서는, 1개의 파일내에 복수의 톱 레벨 클래스를 정의할 수 있습니다.단, 그 중 1개가 퍼블릭인 경우(JLS © 7.6 참조).예를 들면, 이하를 참조해 주세요.
이 기술에 대한 깔끔한 이름이 있습니까(와 유사함)?
inner
,nested
,anonymous
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.class
javac은 검색 대상 소스 파일을 어떻게 알 수 있습니까?
대신 javac에게 컴파일을 지시하면Foo.java
★★★★★★★★★★★★★★★★★」Bar.java
에 컴파일 되어 있던 「」를 .Bar.java
( ( )Baz.class
javac이 찾을 수 있는 곳) 또는Foo
Bar
에에 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
'programing' 카테고리의 다른 글
Javadoc 태그가 완전하지 않은 경우 Maven은 Java 8에서 작동하지 않습니다. (0) | 2022.08.23 |
---|---|
C의 3진수(조건부) 연산자 (0) | 2022.08.23 |
scanf()를 사용하여 문자열 크기를 초과하면 안 됩니다. (0) | 2022.08.23 |
서버에서 Vuex + Vue 풀 상태를 1회만 실행 (0) | 2022.08.23 |
테스트 스위트에서 Jest + Nuxt + Nuxt-Fire가 실패함 (0) | 2022.08.23 |