私の問題文は以下にあります:
私は Java でライブラリを作成しています。特定のクラスについては、ユーザーが自分のクラスを拡張できるようにしたいのですが、1 つのレベルでのみ、それらのサブクラスをサブクラス化できないようにする必要があります。サブクラスを最終的にプログラマーにすれば達成できますが、決定は彼らに委ねられます。ライブラリからこれを制御したい。これどうやってするの ?
どんな助けでもいただければ幸いです
私の問題文は以下にあります:
私は Java でライブラリを作成しています。特定のクラスについては、ユーザーが自分のクラスを拡張できるようにしたいのですが、1 つのレベルでのみ、それらのサブクラスをサブクラス化できないようにする必要があります。サブクラスを最終的にプログラマーにすれば達成できますが、決定は彼らに委ねられます。ライブラリからこれを制御したい。これどうやってするの ?
どんな助けでもいただければ幸いです
リフレクションを使用して、次のようなものを実装できると思います。
public abstract class ExtendOnce {
public static class Subclass extends ExtendOnce {
}
public static class SubSubclass extends Subclass {
}
protected ExtendOnce() {
if (!getClass().getSuperclass().equals(ExtendOnce.class)) {
throw new RuntimeException(
"You extended this class more than once!");
}
}
public static void main(String[] args) {
System.out.println(new Subclass());
System.out.println(new SubSubclass()); // throws exception
}
}
ただし、自問する必要があるより重要な質問は、実際にこの制限が必要かということです。
Java リフレクション APIを使用してgetModifiers()を呼び出し、クラスが final かどうかを確認できます。
スーパークラスのコンストラクターからこれを実行できる場合があります。そうでない場合は、呼び出す必要のあるメソッドを選択する必要があります。それが最終的なものではないことを検出した場合は、例外をスローしたり、JVM を終了したり、JVM が機能しないようにするために必要なことを行うことができます。
ただし、これを行う正当な理由は想像できません。あなたのライブラリのユーザーとして、私はこの恣意的な制限に悩まされます.
また、ライブラリのユーザーは常にオブジェクトを独自のオブジェクトにラップし、継承ではなく構成によって拡張することができます。
これは簡単です。ライセンス条項を書き出すだけです。
あなたのソフトウェアが有用であれば、あなたの要件は珍しいものですが、取引を妨げるものではありません。たとえば、私はお金を使うよりもあなたの要求を受け入れたいと思います。
ソフトウェアが役に立たない場合、要件は異常ですが、取引を妨げるものではありません。誰も気にしません。