Force non-abstract method to be overridden

2019-02-17 16:58发布

问题:

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);
}