Design by Contract(3)

さて、前回の実装とはだいぶ違ってきました。

まず、DoubleやLongはImmutableなクラスなので、
不変表明ができないことに気づく。 (遅い・・・)
+基本的に、そういうのってクラス内オブジェクトにアクセスできないとほとんど使えねーじゃんってことにも気づく。

なので、不変表明はtoStringを実行前と実行後にとっておいて、比較するようにして、
前提条件、事後条件はstrutsタグのような指定のしかたで、内部にアクセスできるようにしました。

なので、こんな感じ。↓
@Invariant(enableds={true, true})
@PreCondition(exps={"@1.doubleValue==20"})
public int invaliantMethod(Double d, int x) {

Invariantが不変表明。 booleanの配列を取り、trueの場合は判定をする。ということにしました。 全部につけなきゃならないわけじゃなく、判定したい箇所までつければOK。
たとえば、4つ引数があって、一番目の引数だけ判定したければ、
@Invariant(enableds={true})
でいいし、
2番目だけのときは
@Invariant(enableds={false,true})
でいい。
※でも、プリミティブ型やImmutableなクラスには使えない・・・
これはどうしようもないのか・・・ね。

んで、前提条件と事後条件。
@PreCondition(exps={"@1.doubleValue==20"})
文字列として、比較式を渡すことに。
@xは引数のどれを指すかを指定する意味。
その後は、.区切りで、メソッド名を書いてけばOK。
そこにアクセスして戻り値と比較します。(呼び出しメソッドは、引数なしが条件)
そのあとは==とか判定を入れてもらえばそれに従い判定します。

左のメソッド呼び出しのクラスは取れるけど、右辺とのうまい判定方法を模索中。 なんかいい方法ないかなー