実行時に抽象メソッドの戻り値を変更することは可能ですか?
例えば:
public abstract class Task {
public abstract boolean validate();
public void setValidate(boolean b) {
/* modify the return value of 'validate' method */
}
}
booleanにフィールドがあり、そのフィールドの値Taskをvalidate返し、その値を変更していないのはなぜsetValidateですか?
public abstract class Task {
private boolean isValid;
public boolean validate() { return isValid; }
public void setValidate(boolean b) { isValid = b; }
}
悲しいかな、もしあなたができれば(とにかく簡単に)。ただし、抽象クラスとサブクラスを変更できる場合は、回避策があります。protected代わりにサブクラスにメソッドを実装させてから、メソッドが検証する前にvalidate()の値をチェックするようにします。サブクラスが変数をチェックしないように変更できないように、例のようにfinalメソッド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;
}
}