불변의 인터페이스
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 클래스로 변환되었습니다. }
- 구체적인 클래스는 불변의 인터페이스를 구현한다고 명시적으로 선언해야 합니다.구체적인 클래스가 서드파티 코드에 "속"하는 경우(예를 들어 라이브러리 내에 포함된 경우)에는 이것이 가능하지 않을 수 있습니다.
- 개체는 실제로 불변하지 않으므로 해시 맵과 같은 불변성에 의존하는 데이터 구조에서 사용하기에 적합하지 않습니다.그리고 그 물체는 "변환측"에서 동시에 수정될 수 있다.
- 불변 개체에 사용할 수 있는 일부 컴파일러 최적화는 가변 개체에 사용할 수 없습니다.
대체 수단
불변의 인터페이스 패턴 대신 불변의 래퍼 패턴이 있습니다.
영속적인 데이터 구조는 사실상 불변할 수 있지만, 그 자체를 수정할 수 있습니다.
레퍼런스
- ^ 불변 인터페이스, c2.com
- 불변, mindprod.com
- Peter Haggar, "Practical Java Praxis 65: 상속 또는 위임을 사용하여 불변의 클래스를 정의하십시오.",IT, 2001년1월 22일
