这似乎是一件奇怪的事情,但是在 Java 中有没有办法阻止子类添加新方法(包括构造函数),同时仍然允许子类覆盖方法?
实际情况是我们有一个abstract
带有一些抽象方法和构造函数的类
abstract class A {
abstract A doX();
abstract boolean isY();
public A(String s){ ... };
}
我们希望这个类的所有具体子类只覆盖这些方法和构造函数。
这是关于在我们的代码中强制执行某种风格,即阻止其他人在代码上添加东西。我们可以告诉他们不要这样做,但这很少奏效,所以我们想知道是否有一种程序化的方式来实现这一点。
显然类不能final
。效率不是最重要的——更简洁的代码更重要。
更新 - 动态方法
正如答案中所指出的那样,没有办法静态地做到这一点,因为防止创建子类的唯一方法是 using 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");
}
}
如果他们使用这些新方法中的任何一种,这将导致他们的测试失败。