反復条件を表すインターフェース IterationCondition には、ただ1つのメソッド evaluate() のみが定義されています。 これは boolean 値を返し、「true」の場合は反復を続け、「false」の場合は反復を終了するというメソッドです。
処理の流れは while 文をイメージするとピッタリです(前回の AbstractIteration の実装を参照):
private IterationCondition ic; public void iterate(final PhysicalSystem system) throws SimulationException{ while(this.ic.evaluate()) evolve(system); }
@Prepare, @Dispose アノテーション
実際には、evaluate() メソッドだけではいろいろな反復条件が実現できません。 そこで、SimulationComponent に定義してある @Prepare, @Dispose アノテーションを使って、初期化等々の処理を定義します。
処理の流れは以下のようになります(以前の記事も参照):
private IterationCondition ic; public void iterate(final PhysicalSystem system) throws SimulationException{ // @Prepare(JoinPoint.ITERATE) の処理 while(this.ic.evaluate()){ // @Prepare(JoinPoint.EVOLVE) の処理 evolve(system); // @Dispose(JoinPoint.EVOLVE) の処理 } // @Dispose(JoinPoint.ITERATE) の処理 }
for 文を使って書くと以下のようになります(チョット分かり難くなりますが):
private IterationCondition ic; public void iterate(final PhysicalSystem system) throws SimulationException{ for(/* @Prepare(JoinPoint.ITERATE) の処理 */; this.ic.evaluate(); /* @Dispose(JoinPoint.EVOLVE) の処理 */){ // @Prepare(JoinPoint.EVOLVE) の処理 evolve(system); } // @Dispose(JoinPoint.ITERATE) の処理 }
サンプル
例えば、決められた回数だけ反復を繰り返す「CountIterationCondition」は以下のようになります:
public class CountIC implements IterationCondition{ private int rest; private int total; // 属性 total に対するアクセッサ・メソッド @Prepare(JoinPoint.ITERATE) public void initialize(){ this.rest = this.total; } public boolean evaluate() { return this.rest > 0 ? true : false; } @Dispose(JoinPoint.EVOLVE) public void countDown() { this.rest--; } }