불변의 인터페이스

Immutable interface

객체 지향 프로그래밍에서 "불변의 인터페이스"는 불변[1]객체를 설계하기 위한 패턴입니다.불변의 인터페이스 패턴에는 스테이트를 변환하는 메서드를 제공하지 않는 타입의 정의가 포함됩니다.해당 유형에서 참조되는 개체는 변동 가능한 상태를 가지지 않으며 불변으로 나타납니다.

자바

2차원 점을 나타내는 Java 클래스를 생각해 보십시오.

일반의 학급 포인트2D {     사적인 인트 x;     사적인 인트 y;     일반의 포인트2D(인트 x, 인트 y) { 이것..x = x; 이것..y = y; }      일반의 인트 X를 취득하다() { 돌아가다 이것..x; }     일반의 인트 움직이다() { 돌아가다 이것..y; }      일반의 무효 세트X(인트 새로운 X) { 이것..x = 새로운 X; }     일반의 무효 설정(인트 새로운) { 이것..y = 새로운; } } 

클래스 Point2D는 변경 가능합니다.구축 후 setter 메서드 중 하나를 호출하여 상태를 변경할 수 있습니다.setX()또는setY()).

Point2D의 불변 인터페이스는 다음과 같이 정의할 수 있습니다.

일반의 인터페이스 불변의 포인트 2d {     일반의 인트 X를 취득하다();     일반의 인트 움직이다(); } 

Point2D가 UnbutablePoint2D를 구현함으로써 클라이언트코드는 변환 메서드가 없는 타입을 참조할 수 있게 되어 불변으로 보입니다.이것은, 다음의 예에 나타나 있습니다.

불변의 포인트 2d 포인트 = 신규 포인트2D(0,0);  // Point2D의 구체적인 인스턴스는 불변의 인터페이스에서 참조됩니다. 인트 x = 포인트.X를 취득하다(); // 유효한 메서드 호출 인트 y = 포인트.세트X(42); // 컴파일 오류: 메서드 setX()가 유형 불변 Point2에 없습니다.d 

불변의 인터페이스만을 참조하는 것으로써, 구체적인 오브젝트의 상태를 변환하는 메서드를 호출하는 것은 유효하지 않습니다.

이점

  • 유형의 불변의 의도를 명확하게 전달합니다.
  • Unmutable Wrapper 패턴을 구현하는 유형과 달리, 는 "No Operation" 명령을 발행하거나 변환 메서드가 호출될 때 런타임 예외를 발생시킴으로써 변환 메서드를 "취소"할 필요가 없습니다.

단점들

  • 불변의 인터페이스 타입에 의해 참조되는 인스턴스는 구체적이고 가변적인 타입으로 캐스팅되어 상태가 변환될 수 있습니다.예를 들어 다음과 같습니다.
    일반의 무효 변이시키다(불변의 포인트 2d 포인트) {     ((포인트2D)포인트).세트X(42); // 이 콜은 합법입니다.유형은                                // 가변 Point2D 클래스로 변환되었습니다. } 
  • 구체적인 클래스는 불변의 인터페이스를 구현한다고 명시적으로 선언해야 합니다.구체적인 클래스가 서드파티 코드에 "속"하는 경우(예를 들어 라이브러리 내에 포함된 경우)에는 이것이 가능하지 않을 수 있습니다.
  • 개체는 실제로 불변하지 않으므로 해시 맵과 같은 불변성에 의존하는 데이터 구조에서 사용하기에 적합하지 않습니다.그리고 그 물체는 "변환측"에서 동시에 수정될 수 있다.
  • 불변 개체에 사용할 수 있는 일부 컴파일러 최적화는 가변 개체에 사용할 수 없습니다.

대체 수단

불변의 인터페이스 패턴 대신 불변의 래퍼 패턴이 있습니다.

영속적인 데이터 구조는 사실상 불변할 수 있지만, 그 자체를 수정할 수 있습니다.

레퍼런스

  1. ^ 불변 인터페이스, c2.com
    - 불변, mindprod.com
    - Peter Haggar, "Practical Java Praxis 65: 상속 또는 위임을 사용하여 불변의 클래스를 정의하십시오.",IT, 2001년1월 22일