Java 在运行时修改抽象方法的返回值

Java 在运行时修改抽象方法的返回值,java,abstract,Java,Abstract,是否可以在运行时修改抽象方法的返回值 例如: public abstract class Task { public abstract boolean validate(); public void setValidate(boolean b) { /* modify the return value of 'validate' method */ } } 为什么不在Task中设置一个boolean字段,让validate返回该字段的值,然后让setV

是否可以在运行时修改抽象方法的返回值

例如:

public abstract class Task {
    public abstract boolean validate();

    public void setValidate(boolean b) {
        /* modify the return value of 'validate' method */
    }
}

为什么不在
Task
中设置一个
boolean
字段,让
validate
返回该字段的值,然后让
setValidate
更改该值

public abstract class Task {
  private boolean isValid;
  public boolean validate() { return isValid; }
  public void setValidate(boolean b) { isValid = b; }
}
唉,要是你能(无论如何,很容易)就好了。但是,如果您可以修改抽象类和子类,则有一个解决方法。让子类实现一个
受保护的
方法,然后让它使您的
validate()
方法在验证之前检查
validate
的值。您可能还应该将
validate()
作为最后一个方法,正如我在示例中所做的那样,这样子类就不能将其更改为不检查变量。当然,这取决于你

以下是解决方案的代码:

public abstract class Task {

    private boolean validate = true;

    public final boolean validate() {
        // Assumes that no validation means validation always passes
        return validate ? validateImpl() : true;
    }

    protected abstract boolean validateImpl();

    public void setValidate(boolean validate) {
        this.validate = validate;
    }
}

我希望验证是抽象的,因为我将在即将到来的项目中大量使用它。这样我就不会忘记设置验证。您唯一真正的选择就是这样,或者只是不提供
setValidate
方法,并且要求子类自己实现
validate
。子类确实实现了验证。任务的每个子类都有自己的验证方法,以满足其特定目的。setValidate方法的要点是根据其他需求修改此任务的需求以执行。然后这些子类必须自己实现类似于此版本的
setValidate
。您无法在运行时像尝试那样重写方法。