を禁止する直接的拡張のJavaクラス以外のパッケージ
-
06-09-2019 - |
質問
しているパッケージ
public abstract class Player { /*...*/ }
これらの
public abstract class GamePlayer extends Player { /*...*/ }
public abstract class TournamentPlayer extends Player { /*...*/ }
public abstract class StatelessPlayer extends Player { /*...*/ }
ユーザーのパッケージが必要選手のものを利用するためには、パッケージを壊すことなく、いつでも必要としない 直接 延長。代わりに、彼らはあるというこのサブクラスを提供する。
質問いつ、どのようにユーザーからプレイヤーに直接?
を探していなければならないということをここは禁止します。
解決
パッケージアクセスのみを持っているPlayer
にコンストラクタを作成します。その後、彼らは、コンストラクタを呼び出すか、それ自体を拡張することができません。すでにのHAVE のPlayer
で明示的なコンストラクタをしない場合は、(そうでない場合、コンパイラはデフォルトのパブリックパラメータなしのコンストラクタを作成するよう)を作成します。
(私はのコンストラクタのにこれをやって提案してきたことに注意してください。クライアントはまだそれを使用できるように、クラス自体は、公開することができます。)
(java.lang.Object
以外の)任意のコンストラクタは、スーパークラスのコンストラクタ(明示的または暗黙的)を呼び出す必要があるため、この作品。何もアクセス可能なコンストラクタが存在しない場合は、サブクラスを作成することはできません。
他のヒント
プレイヤーのコンストラクタは、公開されないことを確認します:
public abstract class Player {
Player() {
// initialization goes here
}
}
そして、クラスが同じパッケージ内からプレーヤーを拡張することができますが、パッケージの外側からのことができるようにはなりません。
うーん...プレイヤークラスは非公表しますか?ただ、「公共」除外、それは同じパッケージ内のクラスだけがそれを拡張することができ、すなわち、パッケージプライベートになります。
しかし、何も完全にそのパッケージに独自のクラスを入れてから人々を防ぐことはありません。私は、同じパッケージに署名のない(または、異なる署名)クラスをロードする試みは失敗します、それが署名したJARにそれを置くことによって、それを防止することが可能だと考えています。
されています。
- を公開インタフェースをものにしたいお客様へのアクセスが作成またはサブクラス
- を公開授業のためのものにしたいお客様へのアクセス や 作成またはサブクラス
- 何もすべき非公開
このアプローチであることだと思いますかする必要のある単一のパッケージにはトレードオフが存在しますが組織としての図書館です。
を使用し複数のパッケージ保護これらを実現するために、OSGi.
OSGiきを制限するパッケージバンドル(jar)は他のバンドルへのアクセスも設定"友人"を束ねることができるキーを利用します。
Javaパッケージとして、保護-ユニットのモデルは十分ではなく頃までにおいて図書館が大---
また、「パッケージプライベート」アクセスとして知られているデフォルトのアクセス修飾子を使用します。言い換えれば、アクセス修飾子を指定しない
abstract class Player { /*...*/ }
ドキュメントでは説明するより詳細にアクセス修飾子の全てます。