看起来像一个模板方法模式。
但是你必须实现Foo.checkable()
并引入另一个抽象方法来委托。
abstract class Foo{
public Foo(){}
public void checkable(){
calledWhenCheckableIsCalled();
doCheckable();
}
protected abstract void doCheckable();
public void calledWhenCheckableIsCalled(){
System.out.println("checkable was called");
}
}
我还建议checkable()
在这种情况下进行最终处理,以便您可以确定checkable()
不能以您期望的其他方式实现。
除了布赖恩·罗奇的评论
缺点是受保护的可以在子类中扩展为公共,因此您不能显式强制执行它。
没错,但是Foo
如果子类增加了doCheckable
. 因此,每当实例化对象时,您都必须引入验证。我建议使用初始化代码,以便在每个存在的构造函数上执行验证。然后不能忘记调用并因此被绕过。
例如:
abstract class Foo {
{ // instance initializer code ensures that enforceDoCheckableVisibility
// is invoked for every constructor
enforceDoCheckableVisibility();
}
public Foo() {...}
public Foo(Object o) {...}
private void enforceDoCheckableVisibility() {
Class<?> currentClass = getClass();
while (currentClass != Foo.class) {
try {
Method doCheckableMethod = currentClass.getDeclaredMethod("doCheckable");
if (Modifier.isPublic(doCheckableMethod.getModifiers())) {
throw new RuntimeException("Visibility of "
+ currentClass.getSimpleName()
+ ".doCheckable() must not be public");
}
} catch (SecurityException | NoSuchMethodException e) {}
currentClass = currentClass.getSuperclass();
}
}
}
由于检查是使用反射实现的,缺点是它只在运行时检查。所以你当然不会有编译器支持。但是这种方法可以让你强制 a 的实例Foo
只有在它履行你的合同时才能存在。