Javaソースファイルに含まれるパブリッククラスの名前が付いているのはなぜですか?


14

私はJavaを学ぶ初心者です。Javaでは、すべてのソースファイルにパブリッククラスが含まれている必要があり、そのソースファイルはそのパブリッククラスと同じ名前を持つ必要があります。さらに、ソースファイルに2つのパブリッククラスを含めることはできません。この制限はなぜですか?


4
詳細がなければ、これはJavaの設計方法の歴史的な設計成果物です。C#などの最近設計された言語は、Javaに似ていますが、この制限はありません。
ガフーア

13
ベストプラクティスを実施するのではありませんか?これが唯一の理由だと思いました。C#では、技術レベルでこの制限はありませんが、ファイル名とクラス名が一致しない場合、または同じファイルに複数のクラスがある場合、StyleCopは文句を言います。Visual Studioは、クラスとファイルの関係を非常に奨励しています(ファイルを作成するクラス図、または.csファイルの名前を変更すると、Visual Studioはクラスの名前もリファクタリングするかどうかを尋ねます)。
アルセニムルゼンコ

古いスタイルのコンパイル言語では、リンカはすべての参照と外部シンボルを見つけます。ただし、Javaはリンクされていません-必要に応じて、実行時にjarをロードできます。リンクするステップがなければ、検索するファイル名がわかっていれば、クラス名をクラスパス内の場所にマップしようとするのははるかに高速です。
ポールトンブリン

4
@gahooaこれは設計成果物ではなく、意図的な設計決定です。これにより、多くのことが非常に簡単になります。

1
grepの使用はどうですか?
ユーザー

回答:


19

Javaスペシャリストのニュースレターの1つで、Heinz KabutzはOak Language Specificationsを掘り下げています。彼は書く:

各パブリッククラスが個別のファイルになっているのはなぜですか?(セクション1)

これは、コース中によく聞かれる質問です。これまでのところ、この質問に対する良い答えはありませんでした。セクション1では、「各Oakコンパイルユニットに複数のクラスまたはインターフェイスを含めることができますが、コンパイルユニットごとに最大1つのクラスまたはインターフェイスをパブリックにすることができます」と読みます。

サイドバーでは、「この制限はまだコンパイラーによって強制されていませんが、効率的なパッケージのインポートには必要です」と説明しています。

設計の理由がわかれば、ほとんどのことがそうであるように、コンパイラーはすべてのコンパイル単位(.javaファイル)に追加のパスを作成して、どのクラスがどこにあるかを把握する必要があり、それによりコンパイルがさらに遅くなります。

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


1
コンパイルをわずかに高速化するには?本当に?それはあなたのコードをもっと整理するからではありませんか?これが正しい答えだとは非常に疑います。
BlueRaja-ダニーPflughoeft

1
BlueRaja-DannyPflughoeftで1998年、私はそれがはるかに大きな違いをしたと確信している@
TheLQ

8

考えられる理由

  • ランダムなパブリッククラスの潜在的に数千のクラスファイルをすべて検索する必要がないため、最初にコンパイラが他のクラスを見つけやすくなります。
    • これはおそらくもう問題ではありませんが、変更されなかった初期のコンベンションを開始しました
  • コンパイルでは、ファイルへの変更はそのファイルにのみ影響します。複数のクラスがある場合、すべてを再コンパイルする必要があります
  • ベストプラクティス-同じファイルに複数のパブリッククラスがあると、混乱を招きます。ファイルの目的はソースコードを整理することであり、フォルダーの目的はファイルを整理することです。特定のパッケージのすべてのクラスが単一の100 MBのスーパーファイルに含まれている場合、すべての利点を失い、ファイルの利点はまったく得られません(さらに、編集時に多くの頭痛の種を追加します)

1
クラスとインターフェイスは、必ずしもソースコードの最も自然な下位区分を表すとは限りません。数千行のコードを1つのファイルにまとめるのは不便ですが、数十のソースファイルに広がる100行の「実際の」コンテンツ(コメントや重複したコンパイラディレクティブを除く)が存在することもありません。私はタイプのためにという名前のファイルがなければならなかった場合、それがどのように動作するか疑問に思うのいずれかの定義が含まれているか、他のないファイルを識別しますか?
supercat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.