実行時に抽象メソッドの戻り値を変更することは可能ですか?
例えば:
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;
}
}