Java 소스 파일에 왜 포함되어있는 공개 클래스의 이름이 있습니까?


14

저는 Java를 배우는 초보자입니다. Java에서 모든 소스 파일은 공개 클래스를 포함해야하며 해당 소스 파일은 해당 공개 클래스와 동일한 이름을 가져야합니다. 또한 소스 파일에는 두 개의 공개 클래스가 포함될 수 없습니다. 왜이 제한이 있습니까?


4
세부 사항이 없으면 Java가 엔지니어링 된 방식의 역사적인 디자인 아티팩트입니다. C #과 같이 최근에 디자인 된 언어는 Java와 유사하지만이 제한이 없습니다.
gahooa

13
모범 사례를 시행하지 않습니까? 나는 이것이 유일한 이유라고 생각했다. C #에서는 기술 수준에 대해이 제한이 없지만 파일 이름과 클래스 이름이 일치하지 않거나 동일한 파일에 여러 클래스가 있으면 StyleCop에서 여전히 불평합니다. Visual Studio는 클래스 파일 관계를 크게 장려합니다 (파일을 만드는 클래스 다이어그램을 생각하거나 .cs 파일의 이름을 바꿀 때 클래스 이름도 리팩토링할지 묻습니다).
Arseni Mourzenko

구식 컴파일 언어에서 링커는 모든 참조 및 외부 기호를 찾습니다. 그러나 Java는 연결되어 있지 않습니다. 원하는 경우 런타임에 jar를로드 할 수 있습니다. 링크 단계가 없으면 찾을 파일 이름을 알고 있으면 클래스 이름을 클래스 경로의 위치에 매핑하는 것이 훨씬 빠릅니다.
Paul Tomblin

4
@gahooa 디자인 아티팩트가 아니며 의도적 인 디자인 결정입니다. 이것은 많은 것들을 훨씬 쉽게 만듭니다.

1
grep을 사용하는 것은 어떻습니까?
사용자

답변:


19

Java 전문가의 뉴스 레터 중 하나에서 Heinz Kabutz는 Oak Language Specification 을 자세히 다룹니다 . 그는 씁니다.

각 공개 수업이 왜 별도의 파일에 있습니까? (섹션 1)

이것은 과정에서 자주 묻는 질문입니다. 지금까지 나는이 질문에 대한 좋은 대답을 얻지 못했습니다. 섹션 1에서는 "각 Oak 컴파일 유닛이 여러 클래스 또는 인터페이스를 포함 할 수 있지만 컴파일 유닛 당 최대 하나의 클래스 또는 인터페이스가 공개 될 수 있습니다"라고 읽습니다.

사이드 바에서 이유를 설명합니다. "이 제한 사항은 효율적인 패키지 가져 오기에 필요하지만 컴파일러에서 아직 시행하지 않았습니다."

대부분의 일이 일단 설계 이유를 알고있는 것처럼 컴파일러는 모든 컴파일 단위 (.java 파일)를 추가로 통과하여 클래스가 어디에 있는지 파악해야하므로 컴파일 속도가 느려집니다. .

http://www.javaspecialists.eu/archive/Issue055.html


1
컴파일 속도를 조금 더 빠르게 하려면 ? 정말? 코드가 훨씬 체계적으로 구성되어 있지 않기 때문에 그렇지 않습니까? 나는 이것이 정답이라고 의심합니다.
BlueRaja-대니 Pflughoeft

1
BlueRaja-DannyPflughoeft에서 1998 @, 나는 확신은 훨씬 더 큰 차이를 만들어
TheLQ

8

내가 생각할 수있는 이유

  • 임의의 공개 클래스를 찾기 위해 잠재적으로 수천 개의 클래스 파일을 모두 검색 할 필요가 없으므로 파일로 이동할 수 있기 때문에 처음에는 컴파일러에서 다른 클래스를 찾는 것이 더 쉽습니다.
    • 이것은 아마도 더 이상 중요하지 않지만 결코 바뀌지 않은 초기 협약을 시작했습니다.
  • 컴파일시 파일 변경은 해당 파일에만 영향을줍니다. 여러 클래스가 있으면 모든 것을 다시 컴파일해야합니다.
  • 모범 사례-동일한 파일에 여러 공개 클래스가 있으면 혼동됩니다. 파일의 목적은 소스 코드를 구성하는 것이며, 폴더의 목적은 파일을 구성하는 것입니다. 특정 패키지의 모든 클래스가 단일 100MB 수퍼 파일에 있으면 모든 장점을 잃어 버렸고 파일의 이점을 얻지 못했습니다 (편집시 많은 두통 추가)

1
클래스와 인터페이스가 소스 코드에 대한 가장 자연스러운 수준의 세분화를 반드시 나타내는 것은 아닙니다. 하나의 파일에 수천 줄의 코드가 어두워지는 것은 불편하지만 수십 개의 소스 파일에 100 줄의 "실제"컨텐츠 (주석 또는 중복 된 컴파일러 지시문 제외)가 확산되어 있지도 않습니다. 나는 그것이 유형에 대한라는 이름의 파일을해야한다면 어떻게 작동하는지 궁금 하거나 정의를 포함하거나 다른 않는 파일을 식별?
supercat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.