Force non-abstract method to be overridden

2019-02-17 16:25发布

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?

3条回答
萌系小妹纸
2楼-- · 2019-02-17 17:12

Something like this?

public abstract class MyBean { 

    public final String foo(){
        String preFinalResult = [...];
        return doFinalResult(preFinalResult)
    }

    protected abstract String doFinalResult(String preFinal);
}
查看更多
等我变得足够好
3楼-- · 2019-02-17 17:14

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.

查看更多
迷人小祖宗
4楼-- · 2019-02-17 17:15

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...

查看更多
登录 后发表回答