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
。您无法在运行时像尝试那样重写方法。