JAVAのファイルに関しての質問です。

「publicクラスは1ファイルにつき1クラス
で、そのときにファイル名とそのクラス名
が一致していなくてはならない」という
ルールがあります。
1ファイルに1publicクラスでなくていけな
い理由を教えて下さい。
どうして複数のpublicクラスが1ファイル上
に存在することが許されないのかが分かり
ません。いろいろ文献やネットでも調べま
したが、探し方がよくないようで見つけら
れませんでした。宜しくお願い致します。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:SevenS No.1

回答回数51ベストアンサー獲得回数3

ポイント20pt

http://msugai.fc2web.com/pgm/structured.html

Java と構造化プログラミング(Structured Programming)

「構造化設計」がキーワードでしょう。モジュール、つまりはクラスの結合度は小さいほどよいとされるので、「各クラスはそれぞれ独立したファイルにまとめられている」と考えれば納得できるかと。


ファイル単位にしてしまえばJVMからみて扱いやすいというところでしょうか?


また、publicでないクラスは、同じファイルにある唯一のpuclibクラスによって利用されるだけで、外部からの参照はできない、つまり「結合度は低いので存在できる」と考えられているのでは?

id:mimio17

ありがとうございます<(_ _)>

・同ファイルにpublicクラスが混在すると、容易に

アクセスができるので、まさに”スパゲッティ”の要因に

なりうる(セキュリティの問題も)。

・汎用性の最も高いpublicクラスを1ファイルに

1つとすれば、いろんな場面で”部品化”が行い

やすい。

などの理由で、1publicクラス1ファイルが望まし

い、という考え方でよろしいでしょうか。。?

「決定的に許されない理由」があるということを

耳にしていました。よろしかったら、もう少し

ご教授いただけませんか?

*ポイントの追加はどうしたらいいのだろう(?_?)

2005/08/02 17:16:40
id:ohmix1 No.2

回答回数235ベストアンサー獲得回数14

ポイント20pt

http://milkyway.merseine.nu/Java/Java002.html

Java講座-クラスを作ろう

上記URLによると、

「コンパイルする段階で必要なクラスが見つからないときに、

Javaのコンパイラが、ファイル名を見て、必要なクラスがそこに定義されているか判断する」

からだそうです。


これが決定的な理由とは思えないですが、

ファイルの外から見た場合に、クラスとソースの関係が簡素になりますし、

その方がコンパイルの処理が簡単になりますよね。

id:mimio17

う〜ん、ここのソースは私も拝見させて

いただきましたが、やっぱりJVMがこういった仕様だって

ことなのでしょうか。。

ありがとうございます<(_ _)>

2005/08/02 17:49:06
id:quintia No.3

回答回数562ベストアンサー獲得回数71

ポイント20pt

A.java に class A と class B が、B.java に class B が定義されているとします。

今のjava実装ではこれらを一括でコンパイルしようとすると、B.classが2つ出来ることになるため、ファイルシステム上で衝突してしまいます。

これを避けるために「1ファイルに1publicクラス」という制約があると考えていいでしょう。

「The Java Language Specification」に以下の様な感じの文がありますね。


パッケージをファイルシステム上に保存するならば衝突を避けるために、コンパイル時にエラーを出す様な制約を課すという選択肢もある。

1つのコンパイル単位にpublicなclassをただ1つだけしか置けない、という制約を暗に示している。


・The type is referred to by code in other compilation units of the package in which the type is declared.

・The type is declared public (and therefore is potentially accessible from code in other packages).

という箇条書きの前後です。

文法上は1つのコンパイル単位(CompilationUnit)に複数の定義が許されているようですけど。

コンパイラの実装で楽をするための制約ということでしょうね。


CompilationUnit:

[package QualifiedIdentifier ; ]

{ImportDeclaration}

{TypeDeclaration}

id:mimio17

Ask.jp:

Packages:

Ask..の方は、別パッケージに存在すれば問題ないかと

思いましたが、Packagesの方で”パッケージをファイルシステム上に保存”

という形を取った前提になるのかと解釈しました。

そして、パッケージ単位で区分されていても、クラス名がかぶって

いるときは、コンパイル時にエラーにすることもできる、ということでしょうか。

Syntax:

やっぱり、”部品化”として”望ましい”形にするために

制約をつけているのでしょうか。

ご解答、ありがとうございます<(_ _)>

2005/08/02 18:11:38
id:terra5 No.4

回答回数57ベストアンサー獲得回数0

ポイント20pt

http://www.javaroad.jp/java_basic2.htm

Javaの道:基本事項(5.クラスパス)

Javaが未ロードのクラスを使用しようとした場合にクラスファイルをロードします。

その時にクラスパスからファイル名で探すためでは。


ファイル名を使わない実装も可能でしょうが、オーバーヘッドを考えてファイル名を使うことにしたのではないかと。


まあ、本来はいけない理由は仕様がそうだからとかしか言えないと思いますが。


なぜそうしたかというと、既に他の方の回答にあるような理由とか、いろいろとあると思います。

id:mimio17

こういった機能もあるのですね(無知でごめんなさい)

実行したいクラスを”ファイル名から探す”のであれば、1public1ファイルで

最も分かりやすいですね。

いろんな角度から、”望ましい”ものが見えてきて、結果的に

1public1ファイルなのかな、と思いました。

ご解答、ありがとうございます<(_ _)>

2005/08/02 18:28:58
id:UJML No.5

回答回数3ベストアンサー獲得回数0

ポイント20pt

http://www.javaworld.com/javaworld/jw-10-1996/jw-10-indepth.html

The basics of Java class loaders - Java World

理由の一つとしては、1ファイルにつき1クラスとすると、クラスローダーの構造が単純になるということが挙げられます。Java のクラスライブラリーのヒエラルキーは、ご存知のようにファイルシステム(もしくは jar ファイル内部)の階層構造と一致しています。もし、一つのファイルに複数の public クラスを含むことを許すと(あるいは、ファイル名とクラス名が一致しないことを許すと)、ファイルとpublicクラスの関連を指示するためのメタ情報が必要となります。

id:mimio17

例えば逐一、クラスの構成を変えることがあったとするなら

(普通、最初の設計段階でそんなことにはなりませんが)

その度にメタ情報を持たせなくてはいけないとしたら

大変”重たい”処理になってしまいますね。。

ご解答、ありがとうございます<(_ _)>

2005/08/02 18:35:33

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • quinta essentia quinta essentia 2006-03-13 16:13:05
  • renmin++ renmin++ 2006-03-13 16:13:05
  • String型を使わない方法 そういや Java で変数を使う場合、型を宣言してやらないといけないんですね。 普段 LL しか使ってないもんで、そういう基本的な事が身に付いてません。。。 更に情
  • Java で FizzBuzz Java をさわるのはほぼ初めて。 String型を使わない方法 そういや Java で変数を使う場合、型を宣言してやらないといけないんですね。 普段 LL しか使ってないもんで、そういう
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません