불변의 객체

Immutable object

객체 지향 및 기능 프로그래밍에서 불변 객체(불변[1] 객체)는 생성된 [2]후 상태를 변경할 수 없는 객체입니다.이는 생성된 후 수정할 수 있는 가변 개체(변경 가능한 개체)와는 대조적입니다.[3] 경우에 따라 내부적으로 사용되는 속성 중 일부가 변경되더라도 개체는 불변으로 간주되지만 외부 관점에서 개체 상태는 변경되지 않은 것으로 보입니다.예를 들어 메모화를 사용하여 값비싼 계산 결과를 캐시하는 개체는 여전히 불변의 개체로 간주될 수 있습니다.

문자열 및 기타 구체적인 객체는 일반적으로 객체 지향 프로그래밍에서 가독성과 런타임 효율성을 향상시키기 위해 불변의 객체로 표현됩니다.불변의 객체는 본질적으로 스레드 [2]세이프하기 때문에 유용합니다.또 다른 장점은 이러한 툴이 가변 [2]객체보다 이해 및 추론하기가 쉽고 보안이 높다는 것입니다.

개념

불변의 변수

명령형 프로그래밍에서 내용이 변경되지 않는 프로그램 변수에 유지되는 값은 실행 중에 변경될 수 있는 변수와 구별하기 위해 상수로 알려져 있습니다.예를 들어 미터에서 피트까지의 변환 계수 또는 소수점 이하 여러 자리에서의 파이 이 포함됩니다.

읽기 전용 필드는 미리 알려진 상수와 달리 프로그램이 실행될 때 계산될 수 있지만 초기화 후에는 변경되지 않습니다.

약하고 강한 불변성

때때로, 어떤 물체의 특정 분야는 불변이라고 말한다.즉, 객체의 다른 부분은 변경할 수 있지만(약하게 불변하는) 객체 상태의 이러한 부분은 변경할 수 없습니다.모든 필드가 불변인 경우 개체는 불변입니다.개체 전체를 다른 클래스로 확장할 수 없는 경우 개체를 완전 불변이라고 [4]합니다.예를 들어, 이는 개체의 수명 동안 개체의 특정 데이터에 대해 특정 불변성을 명시적으로 적용하는 데 도움이 될 수 있습니다.일부 언어에서는 키워드를 사용하여 이 작업을 수행합니다(예:constC++에서는final 필드를 불변으로 지정합니다.OCaml에서 오브젝트 또는 레코드의 필드는 기본적으로 불변이며 명시적으로 마킹해야 합니다.mutable그렇게 하기 위해서.

오브젝트에 대한 참조

대부분의 객체 지향 언어에서는 참조를 사용하여 객체를 참조할 수 있습니다.이러한 언어의 예로는 Java, C++, C#, VB 등이 있습니다.NET 및 Perl, Python, Ruby같은 많은 스크립트 언어.이 경우 참조를 통해 개체를 공유할 때 개체 상태가 달라질 수 있는지 여부가 중요합니다.

참조와 객체 복사

개체가 불변으로 알려진 경우 개체 전체를 복사하는 대신 해당 개체의 참조를 생성하는 것이 좋습니다.이는 데이터 복제를 방지하고 컨스트럭터 및 디스트럭터에 대한 호출을 방지하여 메모리를 절약하기 위해 수행되며 실행 속도가 향상될 수도 있습니다.

참조 복사 기술은 가변 객체 참조의 사용자가 참조를 변경하면 해당 참조의 다른 모든 사용자가 변경 내용을 볼 수 있기 때문에 가변 객체에 대해서는 훨씬 더 사용하기 어렵습니다.이것이 의도한 효과가 아닌 경우, 다른 사용자에게 올바르게 응답하도록 통지하는 것이 어려울 수 있습니다.이러한 상황에서는 참조가 아닌 개체 전체를 방어적으로 복사하는 이 일반적으로 간단하지만 비용이 많이 드는 솔루션입니다.옵저버 패턴은 가변 객체에 대한 변경을 처리하기 위한 대체 기법입니다.

카피 온 라이트

가변 객체와 불변 객체의 장점을 혼합하여 거의 모든 최신 하드웨어에서 직접 지원되는 기술은 COW(Copy-on-Write)입니다.이 기술을 사용하면 사용자가 시스템에 객체를 복사하도록 요청할 때 대신 동일한 객체를 가리키는 새 참조를 생성할 뿐입니다.사용자가 특정 참조를 통해 오브젝트를 수정하려고 하면 시스템은 즉시 실제 복사본을 만들고, 해당 복사본을 수정한 후 새 복사본을 참조하도록 참조를 설정합니다.다른 사용자는 여전히 원래 개체를 참조하기 때문에 영향을 받지 않습니다.따라서 COW에서는 모든 사용자가 오브젝트의 가변 버전을 가지고 있는 것처럼 보이지만 사용자가 오브젝트를 수정하지 않는 경우에는 불변의 오브젝트의 공간 절약과 속도의 이점이 유지됩니다.Copy-on-Write는 애플리케이션 프로그램이 수행할 수 있는 모든 작업을 올바르게 처리하면서 메모리 공간을 절약할 수 있기 때문에 가상 메모리 시스템에서 널리 사용됩니다.

인터닝

동일한 객체의 복사본 대신 항상 참조를 사용하는 관행을 인터닝이라고 합니다.인터닝을 사용하는 경우, 두 개체는 일반적으로 포인터 또는 정수로 표현되는 참조가 동일한 경우에만 동일한 것으로 간주됩니다.예를 들어 Python은 자동으로 짧은 문자열을 인턴으로 사용합니다.가능한 모든 경우에 인터네팅을 구현하는 알고리즘이 확실하게 그렇게 할 수 있는 경우, 동등한 오브젝트의 비교는 포인터를 비교하는 것으로 감소합니다.이는 대부분의 어플리케이션에서 속도가 크게 향상되는 것입니다.(알고리즘이 포괄적이라고 보증되지 않더라도 고속 패스 케이스 임프리(case impr)의 가능성은 여전히 존재합니다.동일한 참조를 사용하고 있을 때 과식합니다.)인터닝은 일반적으로 불변 객체에 대해서만 유용합니다.

스레드 안전성

불변 객체는 멀티 스레드 응용 프로그램에서 유용합니다.여러 스레드는 다른 스레드에 의해 데이터가 변경될 염려 없이 불변의 객체가 나타내는 데이터에 대해 작동할 수 있습니다.따라서 불변 객체는 가변 객체보다 스레드 세이프가 높은 것으로 간주됩니다.

불변성 위반

불변성이라는 것은 컴퓨터 메모리에 저장되어 있는 오브젝트가 쓸 수 없는 것을 의미하지는 않습니다.오히려 불변성은 프로그래머가 오브젝트의 통상적인 인터페이스를 통해 무엇을 할 수 있는지를 나타내는 컴파일 타임의 구성이다(예를 들어 타입 시스템을 회피하거나 C++const correctivity를 위반하는 것).

언어 고유의 상세

Python, Java 경우.NET Framework 문자열은 불변의 객체입니다.Java 와 의 양쪽 모두.NET Framework에는 가변 버전의 문자열이 있습니다.Java에서는 다음과 같습니다.StringBuffer그리고.StringBuilder(자바의 호환 버전)String) 및 에 기재되어 있습니다.NET 이것은StringBuilder(의 가변 버전).그물StringPython 3에는 가변 문자열(바이트) 배리언트가 있습니다.bytearray를 클릭합니다.[5]

또한 Java의 모든 원시 래퍼 클래스는 불변입니다.

유사한 패턴은 Unmutable Interface와 Unmutible Wrapper입니다.

순수 함수형 프로그래밍 언어에서는 언어를 확장하지 않고 (예를 들어, 가변 참조 라이브러리 또는 외부 함수 인터페이스를 통해) 가변 객체를 생성할 수 없기 때문에 모든 객체는 불변합니다.

아다

Ada에서는 모든 객체가 변수(즉, 일반적으로 암묵적인 기본값)로 선언됩니다.constant(즉, 불변)을 경유하여constant키워드를 지정합니다.

  유형 Some_type(일부 타입)  신규 정수; -- 이보다 더 복잡한 것은 없을 것이다.   x: 일정한 Some_type(일부 타입):= 1; --불변의   y: Some_type(일부 타입); --변환 가능 

서브프로그램 파라미터는 in 모드에서는 불변하고 in out out 모드에서는 가변적입니다.

  절차. 하다(a: 정수; b: 나가. 정수; c:나가. 정수)    시작한다.     --a는 불변의     b:= b + a;     c:= a;   끝. 하다; 

C#

C#에서는 클래스 필드의 불변성을 강제할 수 있습니다.readonly진술.모든 필드를 불변으로 적용하면 불변 유형을 얻을 수 있습니다.

학급 AnImmmable(불변)유형 {     일반의 읽기 전용 이중으로 하다 _값;     일반의 AnImmmable(불변)유형(이중으로 하다 x)      {          _값 = x;      }     일반의 AnImmmable(불변)유형 광장()      {          돌아가다 신규 AnImmmable(불변)유형(_값 * _값);      } } 

C++

C++ 에서는, 항상 올바른 실장입니다.Cart사용자가 클래스의 인스턴스를 만든 후 다음 다음 중 하나로 사용할 수 있습니다.const(불변) 또는 필요에 따라 두 가지 다른 버전을 제공함으로써 변경 가능items()method.(C++에서는 전용 컨스트럭터를 제공할 필요가 없습니다.constinstance를 클릭합니다.

학급 카트 {  일반의:   카트(표준::벡터< >아이템> 항목들): 아이템_(항목들) {}    표준::벡터< >아이템>& 항목들() { 돌아가다 아이템_; }   컨스턴트 표준::벡터< >아이템>& 항목들() 컨스턴트 { 돌아가다 아이템_; }    인트 Compute Total 비용() 컨스턴트 { /* 반품 금액 */ }   사적인:   표준::벡터< >아이템> 아이템_; }; 

포인터 또는 다른 객체에 대한 참조가 되는 데이터 멤버가 있는 경우, 비정수 메서드 내에서만 가리키거나 참조하는 객체를 변환할 수 있습니다.

또한 C++는 비트가 아닌 추상적인 불변성을mutable키워드: 멤버 변수를 내부로부터 변경할 수 있습니다.const방법.

학급 카트 {  일반의:   카트(표준::벡터< >아이템> 항목들): 아이템_(항목들) {}    컨스턴트 표준::벡터< >아이템>& 항목들() 컨스턴트 { 돌아가다 아이템_; }    인트 Compute Total 비용() 컨스턴트 {     한다면 (합계_비용_) {       돌아가다 *합계_비용_;     }      인트 합계_비용 = 0;     위해서 (컨스턴트 자동& 아이템 : 아이템_) {       합계_비용 += 아이템.비용.();     }     합계_비용_ = 합계_비용;     돌아가다 합계_비용;   }   사적인:   표준::벡터< >아이템> 아이템_;   변이 가능한 표준::선택적.< >인트> 합계_비용_; }; 

D

D에는 두 가지 유형의 한정자가 있습니다.const그리고.immutable변경할 [6]수 없는 변수의 경우.C++와 달리const, Java의final및 C#의readonly이러한 변수는 과도적이며 이러한 변수의 참조를 통해 도달할 수 있는 모든 항목에 재귀적으로 적용됩니다.의 차이점const그리고.immutable적용 대상:const는 변수의 속성입니다.참조된 값에 대한 가변 참조가 법적으로 존재할 수 있습니다.즉, 값은 실제로 변경될 수 있습니다.그에 반해서,immutable는 참조된 값의 속성입니다.값 및 그 값에서 트랜슬레이셔널하게 도달 가능한 모든 것은 변경할 수 없습니다(타입 시스템을 절단하지 않으면 정의되지 않은 동작이 발생합니다).해당 값의 참조는 모두 표시되어야 합니다.const또는immutable. 기본적으로 모든 부적격 타입에 대하여T,const(T)이음매 없는 결합입니다.T(변동 가능) 및immutable(T).

학급 C {   /*변환 가능*/ 물건 m필드;     컨스턴트     물건 필드;     불변의 물건 아이필드; } 

변이형의 경우C오브젝트, 그것의mField쓸 수 있습니다.의 경우const(C)물건,mField수정할 수 없습니다. 상속됩니다.const;iField더 강력한 보증이기 때문에 여전히 불변합니다.의 경우immutable(C), 모든 필드는 불변입니다.

다음과 같은 기능에서:

무효 기능하다(C m, 컨스턴트 C c, 불변의 C i) { /* 가새 */ } 

교정기 안에c와 같은 오브젝트를 참조할 수 있습니다.m에 대한 돌연변이m간접적으로 변화할 수 있다c뿐만 아니라.또한.c와 같은 오브젝트를 참조할 수 있습니다.i단, 이 값은 불변하기 때문에 변경은 없습니다.하지만,m그리고.i법적으로 동일한 객체를 참조할 수 없습니다.

보증의 관점에서 보면, 변경 가능에는 보증이 없습니다(함수가 개체를 변경할 수 있습니다).const함수가 아무것도 변경하지 않는다는 것을 대외적으로만 보증하는 것입니다.immutable는 쌍방향 보증입니다(함수는 값을 변경하지 않으며 발신자는 값을 변경하지 않습니다).

const또는immutable선언 지점에서 직접 할당 또는 생성자에 의해 초기화되어야 합니다.

왜냐면const파라미터는 값이 변경 가능한지 여부를 잊어버립니다.유사한 구성입니다.inout는 어떤 의미에서 가변성 정보의 변수로 기능합니다.유형의 함수const(S) function(const(T))돌아온다const(S)변수, 상수 및 불변 인수 값을 입력합니다.반면, 유형의 함수는inout(S) function(inout(T))돌아온다S가변용T논쟁들,const(S)위해서const(T)값 및immutable(S)위해서immutable(T)가치.

불변의 값을 변이 가능한 값으로 지정하면 원래 값이 변이 가능한 원본에서 나온 경우에도 변경 시 정의되지 않은 동작이 발생합니다.나중에 가변 참조가 남아 있지 않을 경우 가변 값을 불변으로 지정하는 것이 합법적일 수 있습니다.표현식이 고유하고 그 표현식이 과도적으로 참조하는 모든 표현식이 고유하거나 [6]불변할 경우 표현식은 가변(...)에서 불변으로 변환할 수 있습니다.컴파일러가 고유성을 증명할 수 없는 경우, 캐스팅은 명시적으로 이루어질 수 있으며, 가변 참조가 존재하지 않음을 확인하는 것은 프로그래머에게 달려 있습니다.

종류string의 에일리어스입니다.immutable(char)[], 즉, 불변의 [7]문자의 메모리의 타입 슬라이스입니다.서브스트링을 만드는 것은 포인터와 길이만 복사하고 수정하기 때문에 저렴하고 기본 데이터를 변경할 수 없기 때문에 안전합니다.유형 객체const(char)[]는 문자열을 참조할 수 있지만 가변 버퍼도 참조할 수 있습니다.

상수 또는 불변 값의 얕은 복사본을 만들면 불변성의 외부 레이어가 제거됩니다.불변 문자열 복사(immutable(char[]))는 문자열을 반환합니다(immutable(char)[]). 불변의 포인터와 길이가 복사되고 복사본은 변동 가능합니다.참조된 데이터는 복사되지 않고 한정자를 유지합니다(예:immutable디퍼 카피를 작성하면, 예를 들면 「Depper Copy(디퍼 카피)」를 떼어낼 수 있습니다.dup기능.

자바

불변 객체의 전형적인 예는 Java의 인스턴스입니다.String학급

스트링 s = 'ABC"; s.대소문자를 낮추기(); 

방법toLowerCase()데이터 "ABC"는 변경되지 않습니다.s포함하다.대신 새로운 String 객체가 인스턴스화되며 구성 중에 데이터 "abc"가 지정됩니다.이 String 객체에 대한 참조는 에 의해 반환됩니다.toLowerCase()방법.문자열을 작성하려면s데이터 "확장"을 포함하므로 다른 접근법이 필요합니다.

s = s.대소문자를 낮추기(); 

이제 문자열s는 "abc"를 포함하는 새로운 String 개체를 참조합니다.Class String 선언 구문에는 이를 불변으로 강제하는 것이 없습니다.String 클래스의 메서드는 String 객체에 포함된 데이터에 영향을 주지 않으므로 불변으로 만들 수 없습니다.

키워드final(본문)은 불변의 원시 유형 및 객체 [8]참조를 구현하는 데 사용되지만, 그 자체로 객체 자체를 불변하게 만들 수는 없습니다.다음의 예를 참조해 주세요.

원시 유형 변수(int,long,short, 등)를 정의한 후 재할당할 수 있습니다.이것은, 다음의 방법으로 막을 수 있습니다.final.

인트 i = 42; //int는 원시 유형입니다. i = 43; // OK(확인)  최종 인트 j = 42; j = 43; // 컴파일되지 않습니다.j는 최종이므로 재할당할 수 없습니다. 

참조 유형은 단순히 를 사용하여 불변으로 할 수 없습니다.final키워드를 지정합니다. final는 재할당을 방해할 뿐입니다.

최종 마이 오브젝트 m = 신규 마이 오브젝트(); //m은 참조 유형입니다. m.데이터. = 100; // OK. 객체 m의 상태를 변경할 수 있습니다(m은 가변이며 final은 이 사실을 변경하지 않습니다). m = 신규 마이 오브젝트(); // 컴파일되지 않습니다.m은 최종이므로 재할당할 수 없습니다. 

프리미티브 래퍼(Integer,Long,Short,Double,Float,Character,Byte,Boolean)도 모두 불변합니다.불변의 클래스는, 몇개의 [9]간단한 가이드 라인을 따르는 것으로 실장할 수 있습니다.

자바스크립트

JavaScript에서는 모든 프리미티브 유형(Undefined, Null, Boolean, Number, BigInt, String, Symbol)은 불변이지만 커스텀오브젝트는 일반적으로 변경할 수 있습니다.

기능. 어떻게 좀 해봐.(x) { /* 여기서 x를 변경하면 원본이 변경됩니까?*/ }; 변화하다 스트레이트 = '끈'; 변화하다 obj = { 한 사람: '개체' }; 어떻게 좀 해봐.(스트레이트);         // 문자열, 숫자 및 Bool 유형은 불변이며 함수는 복사본을 가져옵니다. 어떻게 좀 해봐.(obj);         // 객체는 참조에 의해 전달되며 함수 내부에서 변동 가능 다른 일을 하다(스트레이트, obj); // str은 변경되지 않았지만 obj는 변경되었을 수 있습니다. 

객체의 불변성을 시뮬레이션하기 위해 속성을 읽기 전용(쓰기 가능: false)으로 정의할 수 있습니다).

변화하다 obj = {}; 물건.define Property(정의 속성)(obj, '푸', { 가치: '바', 기입 가능한: 거짓의 }); obj.후우 = '바2'; // 자동으로 무시됨 

그러나 위의 접근법에서는 여전히 새로운 속성을 추가할 수 있습니다.또는 Object를 사용할 수도 있습니다.freeze를 사용하여 기존 객체를 불변으로 만듭니다.

변화하다 obj = { 후우: '바' }; 물건.얼다(obj); obj.후우 = '바'; // 속성을 편집할 수 없습니다. 자동으로 무시됩니다. obj.foo2 = '바2'; // 속성을 추가할 수 없습니다. 자동으로 무시됩니다. 

ECMA262를 구현하면 JavaScript는 재할당할 수 없는 불변의 참조를 생성할 수 있습니다.단, 를 사용하여const선언은 읽기 전용 참조의 값이 불변하는 것이 아니라 이름을 새 값에 할당할 수 없음을 의미합니다.

컨스턴트 항상_불변 = 진실의;  해라 {   항상_불변 = 거짓의; } 또 만나 (에러) {   콘솔.로그.("불변 참조를 재할당할 수 없습니다."); }  컨스턴트 arr = [1, 2, 3]; arr.밀다(4); 콘솔.로그.(arr); // [1, 2, 3, 4] 

Redux같은 플럭스와 유사한 [10]상태 관리 패턴을 선호하는 React가 도입된 이후 JavaScript에서 불변 상태의 사용은 증가 추세가 되었습니다.

Perl에서는 모든 속성을 읽기 전용으로 선언하는 것만으로 Moo 라이브러리를 사용하여 불변의 클래스를 만들 수 있습니다.

패키지 불변의; 사용하다 ;  가지다 가치 => (           => '로',   # 읽기 전용     체납 => '데이터', #은(는) 컨스트럭터에 다음 값을 제공하여 덮어쓸 수 있습니다.                        # 값:불변 -> 신규(값 => '다른 것'); );  1; 

불변 클래스 작성에는 다음 두 가지 단계가 필요합니다.첫 번째 단계는 오브젝트 속성 변경을 방지하는 접근자 작성(자동 또는 수동)입니다.두 번째 단계는 해당 클래스의 인스턴스 데이터를 직접 변경하는 것을 방지하는 것입니다(일반적으로 해시 참조에 저장되며 해시를 사용하여 잠글 수 있습니다).: Util의 lock_hash 함수):

패키지 불변의; 사용하다 엄격한.; 사용하다 경고.; 사용하다 기초 qw(클래스::악세사리); # 읽기 전용 액세스 장치 생성 __PACKAGE__->mk_ro_accessors(qw(값)); 사용하다 해시: Util '잠금_잠금';  후보선수 신규 {     나의 $클래스 = 교대하다;     돌아가다 $클래스 한다면 레퍼런스($클래스);     죽어버려 "new에 대한 인수는 키 => 값 쌍\n이어야 합니다."         ~하지 않는 한 (@_ % 2 == 0);     나의 %parames(%pause) = (         가치 => '데이터',     );     나의 $obj = {         %parames(%pause),         @_,     };     축복하다 $obj, $클래스;     # 객체 데이터 수정 방지     lock_displays(잠금) %$obj; } 1; 

또는 수동으로 작성된 접근기를 사용하는 경우:

패키지 불변의; 사용하다 엄격한.; 사용하다 경고.; 사용하다 해시: Util '잠금_잠금';  후보선수 신규 {     나의 $클래스 = 교대하다;     돌아가다 $클래스 한다면 레퍼런스($클래스);     죽어버려 "new에 대한 인수는 키 => 값 쌍\n이어야 합니다."         ~하지 않는 한 (@_ % 2 == 0);     나의 %parames(%pause) = (         가치 => '데이터',     );     나의 $obj = {         %parames(%pause),         @_,     };     축복하다 $obj, $클래스;     # 객체 데이터 수정 방지     lock_displays(잠금) %$obj; }  읽기 전용 접근자 수 후보선수 가치 {     나의 자기 부담 = 교대하다;     한다면 (나의 $new_value = 교대하다) {         # 새로운 값 설정 시도         죽어버려 "이 개체는 수정할 수 없습니다\n";     } 또 다른 {         돌아가다 자기 부담->{가치}     } } 1; 

파이썬

Python에서는 일부 내장형(number, boulan, string, tuples, frozenset)은 불변하지만 커스텀클래스는 일반적으로 변경할 수 있습니다.클래스에서 불변성을 시뮬레이션하기 위해 Atribut 설정 및 삭제를 덮어쓰고 예외를 발생시킬 수 있습니다.

학급 불변점:     x와 y의 두 속성을 가진 불변의 클래스."""      __param__ = ['x', 'y']      방어하다 __setattr__(자신, *args):         올리다 타입 에러("불변의 인스턴스를 수정할 수 없습니다.")      __delattr__ = __setattr__      방어하다 __init__(자신, x, y):         # 인스턴스 데이터를 저장하기 위해 self.value = 값을 사용할 수 없습니다.         # 그래서 우리는 명시적으로 슈퍼클래스를 호출해야 한다         잘 하는 군요().__setattr__('x', x)         잘 하는 군요().__setattr__('y', y) 

Python 3.6 이후부터 사용할 수 있는 표준 라이브러리 도우미 및 는 단순한 불변의 클래스를 만듭니다.다음 예시는 위와 거의 동등하며, 몇 가지 태플과 유사한 기능도 있습니다.

부터 타자 치기 수입품 명명된 튜플 수입품 수집품  포인트 = 수집품.명명된 태플(포인트, ['x', 'y'])  # 위와 유사한 명명된 태플을 만듭니다. 학급 포인트(명명된 튜플):     x: 인트     y: 인트 

Python 3.7에서 소개된 개발자는 동결된 인스턴스로 불변성을 에뮬레이트할 수 있습니다.동결된 데이터 클래스가 만들어지면dataclasses덮어쓰다__setattr__()그리고.__delattr__()키우다FrozenInstanceError호출된 경우.

부터 데이터 클래스 수입품 데이터 클래스  @dataclass(=진실의) 학급 포인트:     x: 인트     y: 인트 

라켓

라켓은 코어 페어 타입("cons cell")을 불변하게 함으로써 다른 스킴의 실장과는 크게 다릅니다.대신 병렬 변환 가능한 페어 타입을 제공합니다.mcons,mcar,set-mcar!또, 예를 들면, 불변의 문자열이나 벡터등의 불변의 타입이 다수 서포트되고 있어 폭넓게 이용되고 있다.필드가 특별히 가변으로 선언되지 않는 한 새 구조물은 기본적으로 변경되지 않습니다.

(구조 foo1 (x y))             ; 모든 필드 불변 (구조 foo2 (x [y #: 가변])) ; 1개의 가변 필드 (구조 foo3 (x y) #: 가변)   ; 모든 필드 가변 

이 언어는 또한 불변의 해시 테이블, 기능적으로 구현된, 불변의 사전을 지원합니다.

러스트의 소유제도는 개발자가 불변의 변수를 선언하고 불변의 참조를 전달할 수 있도록 한다.기본적으로는 모든 변수와 참조는 변경되지 않습니다.가변 변수 및 참조는 다음과 같이 명시적으로 생성됩니다.mut키워드를 지정합니다.

Rust의 상수 항목은 항상 불변입니다.

//일정 품목은 항상 불변의 const ALWAYS_IMMUTABLE:bool)진정한;struct Object{x, y:usize usize,}fn main(){// 명시적으로 변할 수 있는 변수를 선언하자 mutmutable_obj)Object{x:1, y:2};mutable_obj.x=3;//잘mutable_ref=및 수 있도록 해;mut mutable_obj, mutable_ref.x=1; 괜찮게immutable_ref=및//;mutable_obj.;immutaable_ref.x = 3; // 오류 E0594 // 기본적으로 변수는 불변인 채로 둡니다. = 개체 { x: 4, y: 5 }; unfiltable_obj.x = 6; // 오류 E0596 = &mutable_ref2; // 오류 E0596 = 불변인 채로 둡니다.

스칼라

Scala에서는 모든 엔티티(좁게는 바인딩)를 가변 또는 불변으로 정의할 수 있습니다: 선언에서는 다음을 사용할 수 있습니다.val(가치) 불변의 실체 및var(7) 변이할 수 있는 것.불변의 바인딩을 재할당할 수 없는 경우에도 그 바인딩은 여전히 변경 가능한 객체를 참조할 수 있으며, 그 오브젝트 상에서 변환 메서드를 호출할 수 있습니다.바인딩은 불변하지만 기본 오브젝트는 변경 가능한 경우가 있습니다.

예를 들어 다음과 같은 코드 스니펫이 있습니다.

 최대값 = 100 변화하다 현재의 가치 = 1 

불변의 엔티티를 정의하다maxValue(정수 타입은 컴파일 시 추론됩니다) 및 가변 엔티티 이름currentValue.

디폴트로는 다음과 같은 컬렉션 클래스가 있습니다.List그리고.Map는 불변하기 때문에 update-relay는 기존 인스턴스를 변환하지 않고 새 인스턴스를 반환합니다.비효율적으로 들릴 수 있지만 이러한 클래스의 구현과 불변성을 보장하면 새 인스턴스가 기존 노드를 재사용할 수 있으며, 특히 복사본을 만드는 경우 매우 [11][better source needed]효율적입니다.

「 」를 참조해 주세요.

레퍼런스

문서에는 Perl Design Patterns Book의 자료가 포함되어 있습니다.

  1. ^ "immutable adjective - Definition, pictures, pronunciation and usage notes - Oxford Advanced Learner's Dictionary at OxfordLearnersDictionaries.com". www.oxfordlearnersdictionaries.com.
  2. ^ a b c 괴츠 등Java 동시성(Practice 。애디슨 웨슬리 프로페셔널, 2006, 섹션 3.4불변성
  3. ^ "6.005 — Software Construction".
  4. ^ David O'Meara (April 2003). "Mutable and Immutable Objects: Make sure methods can't be overridden". Java Ranch. Retrieved 2012-05-14. The preferred way is to make the class final. This is sometimes referred to as "Strong Immutability". It prevents anyone from extending your class and accidentally or deliberately making it mutable.
  5. ^ "Built-in Functions — Python v3.0 documentation". docs.python.org.
  6. ^ a b D언어사양© 18
  7. ^ D언어사양 © 12.16 (어레이와 슬라이스라는 용어는 서로 바꾸어 사용합니다.)
  8. ^ "How to create Immutable Class and Object in Java – Tutorial Example". Javarevisited.blogspot.co.uk. 2013-03-04. Retrieved 2014-04-14.
  9. ^ "Immutable objects". javapractices.com. Retrieved November 15, 2012.
  10. ^ "Immutability in JavaScript: A Contrarian View". Desalasworks.
  11. ^ "Scala 2.8 Collections API – Concrete Immutable Collection Classes". Scala-lang.org. Retrieved 2014-04-14.

외부 링크