Loading article…
オブジェクト指向プログラミングにおいて、「不変インターフェース」は不変オブジェクトを設計するためのパターンです。[ 1 ]不変インターフェースパターンでは、状態を変更するメソッドを提供しない型を定義します。その型によって参照されるオブジェクトは、可変状態を持たないとみなされ、不変に見えます。
2次元の点を表すJavaクラスを考えてみましょう。
public class Point2D { private int x ; private int y ; public Point2D ( int x , int y ) { this . x = x ; this . y = y ; }public int getX ( ) { return this.x ; } public int getY ( ) { return this.y ; }public void setX ( int newX ) { this.x = newX ; } public void setY ( int newY ) { this.y = newY ; } }Point2D クラスは可変です。構築後、セッター メソッド (setX()またはsetY()) のいずれかを呼び出すことで、その状態を変更できます。
Point2Dの不変インターフェースは次のように定義できます。
public interface ImmutablePoint2D { public int getX (); public int getY (); }Point2DにImmutablePoint2Dを実装させることで、クライアントコードは変更メソッドを持たない型を参照できるようになり、結果として不変に見えるようになります。これは次の例で示されています。
ImmutablePoint2D point = new Point2D ( 0 , 0 ); // 不変インターフェースによって参照される Point2D の具体的なインスタンスint x = point.getX (); // 有効なメソッド呼び出しint y = point.setX ( 42 ); // コンパイルエラー: 型 ImmutablePoint2D にはメソッド setX() が存在しません不変インターフェースのみを参照する場合、具体的なオブジェクトの状態を変更するメソッドを呼び出すことは無効です。
public void mutate ( ImmutablePoint2D point ) { (( Point2D ) point ). setX ( 42 ); // 型が可変の Point2D クラスに変換されているため、この呼び出しは有効です}不変インターフェースパターンの代替案として、不変ラッパーパターンがある。
永続データ構造は、実質的に不変でありながら、自身に対する変更可能なビューを許容する。