看起来像是template method pattern。
但是,您必须执行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();
}
}
}
由于检查是使用反射实现的缺点是,它是在运行时仅检查。所以你当然不会有编译器支持。但是这种方法可以让你执行一个Foo
的实例,只有当它满足你的合同时才能存在。
呃,没有。 <----> –
@BrianRoach叹了口气,我很确定这是行不通的。这将使我想要的功能更容易实现。 – Others
你只知道'checkable()'被调用的方法是在里面放一些代码。或者围绕它创建包装方法。 – Santosh