これは奇妙なことのように思えるかもしれませんが、サブクラスがメソッドをオーバーライドできるようにしながら、サブクラスが新しいメソッド (コンストラクターを含む) を追加するのを止める方法は Java にあるのでしょうか?
実際の状況は、abstract
いくつかの抽象メソッドとコンストラクターを持つクラスがある場所です
abstract class A {
abstract A doX();
abstract boolean isY();
public A(String s){ ... };
}
そして、このクラスの具象サブクラスはすべて、これらのメソッドとコンストラクターのみをオーバーライドする必要があります。
これは、コードに特定のスタイルを強制することです。つまり、コードに取り組んでいる他の人が何かを追加するのを止めます。やめるように言うこともできましたが、それがうまくいくことはめったにありません。
明らかに、クラスを にすることはできませんfinal
。効率は最優先事項ではありません。よりクリーンなコードがより重要です。
更新 - 動的アプローチ
回答で指摘されているように、サブクラスの作成を防ぐ唯一の方法は を使用することであるため、これを静的に行う方法はありませんが、これは機能しfinal
ません。しかし、動的なアプローチを使用できるので、現在の解決策はこれaspect
をプロジェクトに追加することです (既に を使用していますAspectJ
)。
public aspect WatchA{
before() : execute(* A.*()) || execute(* A.*(..)) {
String methodCalled = joinPoint.getSignature().getName();
Class<?> c = Class.forName(args[0])
Method[] allMethods = c.getDeclaredMethods();
boolean found = false;
for(Method m : allMethods)
found |= m.getName().equals(methodCalled);
if(!found)
throw new RuntimeException("Do not add method "+methodCalled+" to A");
}
}
これらの新しい方法のいずれかを使用すると、テストが失敗する原因になります。