Java Programming Language

Googleの20%プロジェクトからJava向けの新しい技術「cofoja (Contracts for Java)」が公開された。既存の実装に大きく手を加えることなく、デバッグをより簡単にしてくれる効果が期待できる。バグは些細なコードが起こすものだったりするが、それを追跡して発見するのは時に困難を極める。これは問題が発生した箇所と、実際にバグがある箇所が大きく離れていることが理由になっていることもある。問題発生箇所とバグ発生箇所を近くにまとめることができれば、それだけバグ発見も取り組みやすくなる。

cofojaはこれを簡単に実現するための技術。インタフェースに制約表現を追加可能にするところがポイントとなっており、クラスの実装に手を加えなくてもインタフェースに制約表記を追加することで実行時にチェックできるようになる。ブログに掲載されている次の例がわかりやすい。

/**
* @param left a sorted list of elements
* @param right a sorted list of elements
* @return the contents of the two lists, merged, sorted
*/
List merge(List left, List right);

上記は通常のインタフェース表記。引数の条件はコメントとして記載されている。下記コードはこれにcofojaを適用した例。引数の条件をアサーションの形で記入している。通常は何も行われないが、引数に有効化を指定して実行すると、この表記に従った引数チェックが実施されるようになる。

@Requires({
"Collections.isSorted(left)",
"Collections.isSorted(right)"
})
@Ensures({
"Collections.containsSame(result, Lists.concatenate(left, right))",
"Collections.isSorted(result)"
})
List merge(List left, List right);

クラスの実装で事前条件と事後条件などをチェックするようにした場合、すべてのクラスでこの条件を実装する必要がでてくる。これをインタフェースに指定できればインタフェースを実装するすべてのクラスでこの条件チェックを自動的に実施できて便利。