けれどものJava コンパイラは、単一のソースファイルに複数のトップレベルのクラスを定義することができますが、ない良いをやっておらず、大きな風がある
リスクが。リスクは、ソースファイルで複数のトップレベルクラスを定義すると、クラスに複数の定義を提供できるようになることです。どのソースファイルの使用して定義される
一連のコンパイラに渡された衝撃部材を。
public class Main { public static void main(String [] args){ System.out.println(Utensil.NAME + [Dessert.NAME](http://Dessert.NAME)); } } / /一つのファイルに定義された2つのクラス。これを行わないでください! class Utensil { static final String NAME = "pan"; } c lass Dessert { static final String NAME = "cake"; }
次に、同じ2つのクラスを定義する Dessert.javaという名前の別のソースファイルを誤って作成したとします。
// 1つのファイルで2つのクラスが定義されています。これを行わないでください! class Utensil { static final String NAME = "pot"; } c lass Dessert { static final String NAME = "pie"; }
あなたは幸運十分にある場合は、コマンドを使用javacのMain.java Dessert.javaのコンパイラを、コンパイラが失敗し、コンパイラは
、あなたがクラス定義されてきた多くの回を教えてくれます用具やデザートを。コンパイラは最初にコンパイルするためですMain.javaがあり、
それがために見ているとき用具(それは引用デザートは、先に引用)、それがでますUtensil.java でこれを見つけ
クラスと見つける用具やデザートを。コマンドラインにすると、コンパイラの出会いDessert.java 、それがに引っ張ってくる
、それが遭遇する原因と、ファイル用具やデザートが定義されました。
コマンドjavac Main.java またはjavac Main.java Utensil.javaを使用してプログラムをコンパイルする場合、その動作はDessert.java ファイル
を書き込むのと同じです(つまり、パンケーキを印刷します))以前の動作は同じです。コマンドを使用する場合ただし、javacの
Dessert.java Main.javaがあるコンパイラ、それが印刷されますpotpieを。したがって、プログラムの動作がコンパイルされるソースファイルがに渡され
、明らかに受け入れられないフィルタ、の順に影響を及ぼす
この問題に対する解決策は簡単ですが、(そのような私たちの例のように、トップ層用具とデザートは)別のソースに分かれている
ファイル。単一のトップレベルクラスのソースファイルを配置するための複数の試みている場合、(節参照静的クラスメンバーを使用することを検討して24 クラス分割としてバー)
別の代替ソースファイルに。これらのクラスが別のクラスに属している場合、
読みやすさを向上させるため、通常は静的メンバークラスにすることをお勧めします。また、プライベートとして宣言することでクラスを削減できます(詳細については、第15条を参照してください)アクセシビリティ
public class Test { public static void main(String [] args){ System.out.println(Utensil.NAME + [Dessert.NAME](http://Dessert.NAME)); } p rivate static class Utensil { static final String NAME = "pan"; }
プライベート静的クラスDessert {
static final String NAME = "cake" ;
}
ソースファイルに複数の最上位クラスまたはインターフェイスを配置しないでください。この保証は、コンパイル時にルールに従わない
複数の定義を持つことができます。これは、順番にせずに、コンパイラのためにコンパイル済みのクラスファイルやプログラムソースファイルの生成行動の配信を保証
クリアランス。