看起來像是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