Javaプロジェクトですべてのクラスを公開するのがベストプラクティスですか?私が取り組んだすべてのJavaプロジェクトには、パブリッククラスしかないことに気づきました。
7 に答える
ガイドラインではありません。
情報隠蔽の原則は、結合を最小限に抑えるために必要なものだけを公開し、それ以上は公開しないように指示しています。
したがって、たとえば、クラスによって別のクラスのロジックをより簡単に処理でき、そのクラスでのみ使用される場合、それを公開する理由はなく、公開する必要もありません。
あなたの質問に対する簡単な答えは「いいえ」です。
もう少し複雑なのは、クラスをそれ自体のパッケージ外の他のクラスで使用する必要がある場合にのみ、クラスを公開する必要があるということです。しかし、私のように、プロジェクトを読みやすくするために多くのパッケージに分割した場合、クラスを使用できるようにするには、クラスを公開する必要があります。
あなたの質問は簡単に尋ねることができますが、その性質上単純ではありません。多くはあなたが書いているコードの種類に依存します。ライブラリを作成している場合、外部で使用することはおそらくあなたの議題の上位にあります。アプリケーションではそれほどではありません。
私は公的なアプローチを好むことがわかりました。オプションを開いたままにし、再利用の問題のために実装についてより慎重に考えるようになり、それがより良いコードにつながるため、再利用のために設計しようとしています。しかし、それは本当にコースのための馬です、あなたはこの方程式の最大の変数です。
トップレベルのクラスの場合、別のパッケージの他のクラスにクラスを表示させたい場合は、次のようにする必要がありmark it public
ます。同じパッケージ内のクラスのみにクラスを表示させたい場合mark it default
(修飾子なし)。
だから、あなたの質問は本当に、すべてのトップレベルのクラスを公開する必要がありますか?つまり、プロジェクトで行うパッケージアクセスの使用法に帰着すると思います。この質問は、少し前にそれに関連していました。
通常、ほとんどのクラスは実際にパブリックですが、デフォルトまたはプライベートスコープも使用したい場合があります。
デフォルトのスコープを使用するクラスは、同じパッケージ内の他のクラスにのみアクセスできます。たとえば、ヘルパークラスの場合、コードがよりカプセル化されるため、この方法での使用を制限することをお勧めします。同じ理由で、プライベートスコープは内部クラスに使用されることがよくあります。
いいえそうではありません。他のアクセス指定子または匿名のクラスがたくさんあります。たとえば、「ActionListener」や「ItemListener」などのリスナーに登録できるプライベートクラスまたは匿名クラスを作成できます。そのように、さまざまな目的のために、パブリック指定子なしで多くのクラスを作成します。それは本当にあなたの仕事を断片に分けるのを助けます。
ただし、Javaでは、通常、すべてのソースファイルにパブリッククラスが含まれています。これは、ソースファイルの名前が「Reader.java」の場合、そのソースファイル内にクラス「Reader」のプライベートまたはその他のアクセス指定子を含めることができないためです。パブリックまたはデフォルトである必要があります。それを除けば、他のクラスは「Reader」クラスの代わりに「public」アクセス指定子を持つことができません。
その他、プライベート、プロテクト、その他のタイプ(デフォルトを除く)のクラスは、ソースファイルに「独立したクラス」として書き込むことはできません。例として、以下はエラーです
Check.java
private class Check
{
}
それは間違いなくベストプラクティスではありません。ほとんどのプログラマーはトップレベルのクラスがパブリックである必要がないことを知らないので、あなたはそれを見ています。
理想的には、パッケージはクラスをグループに編成するための単なる方法ではありません。1つのパッケージに属するクラスの最小数または最大数はありません。むしろ、サブパッケージは、パッケージレベルのクラスやメンバーが必要な場合にのみ作成する必要があります。Java APIはこれを頻繁に行い、Sun / Oracleから配布されたjavadocは保護されたレベルのクラスとメンバー用に生成されるため、一部のパッケージは無意味に見えるほどまばらに見える場合があります。
たとえば、javax.swing.colorchooserパッケージには4つのクラスしかないように見えますが、実際には17のクラスがあります(実際の数はJavaのバージョンによって異なる場合があります)。4つは公開されています。残りはJColorChooser内部でのみ使用されます。
大きくなりすぎて内部クラスとして簡単に保守できない内部クラスは、通常、非公開のトップレベルクラスになるための適切な候補であることがわかりました。