I have a method String foo()
in an abstract class which already does a few precomputations but can't deliver the final result the method is supposed to return. So what I want is that each non-abstract class inheriting from my abstract class has to implement foo
in a way that first super()
is called and then the result is computed. Is there a way to force this in java?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Yes, by redesigning to use the template method pattern and including an abstract method:
public abstract class AbstractSuper {
public final String foo() {
// Maybe do something before calling bar...
String initialResult = bar();
// Do something common, e.g. validation
return initialResult;
}
protected abstract String bar();
}
Basically if you want to force subclasses to override a method, it does have to be abstract - but that doesn't have to be the method that is called by other code...
回答2:
There's no way to do this in Java. However you can declare one more method which is abstract and call it. Like this:
public final String foo() {
String intermediate = ... // calculate intermediate result;
return calculateFinalResult(intermediate);
}
protected abstract String calculateFinalResult(String intermediate);
This way you will be forced to override calculateFinalResult
. No calling of super
instance is necessary. Also subclasses will not be able to redefine your foo()
as it's declared as final
.
回答3:
Something like this?
public abstract class MyBean {
public final String foo(){
String preFinalResult = [...];
return doFinalResult(preFinalResult)
}
protected abstract String doFinalResult(String preFinal);
}