인스턴스를 변경하지 못하게하는 쉬운 방법이 있습니까?불변의 클래스를 만드는 쉬운 방법이 있습니까?
class MyObject
{
// lots of fields painful to initialize all at once
// so we make fields mutable :
public String Title { get; set; }
public String Author { get; set; }
// ...
}
창조의 예 :
MyObject CreationExample(String someParameters)
{
var obj = new MyObject
{
Title = "foo"
// lots of fields initialization
};
// even more fields initialization
obj.Author = "bar";
return obj;
}
하지만 지금 내가 가지고있는 것을
의이 예를하자, 나는 데이터 필드의 많은 (데이터 만, 어떤 동작을) 들고 클래스가 개체를 완전히 만들었으므로 더 이상 개체를 변경할 수 없기 때문에 (데이터 소비자가 상태를 변경할 필요가 없기 때문에) List.AsReadOnly :
var immutableObj = obj.AsReadOnly();
하지만이 동작을 원한다면 정확히 동일한 필드가 있지만 설정자가없는 다른 클래스를 만들어야합니다.
그래서이 불변 클래스를 자동 생성하는 방법이 있습니까? 또는 생성 중에 변경 가능하지만 일단 초기화되면 변경할 수있는 또 다른 방법은 무엇입니까?
필드는 "읽기 전용"으로 표시 될 수 있지만 클래스 외부에서 개체가 초기화되고 모든 필드를 생성자 매개 변수로 전달하는 것은 나쁜 아이디어 (너무 많은 매개 변수)처럼 보입니다.
너무 많은 매개 변수가 있고 .... 매개 변수를 생성자를하고 싶은 해달라고하면
성 동적 프록시에서 원래의 예를 기반으로 당신 돈 생성자 호출에서 초기화하려고하지 않습니다 (어떤 이유로). 내 머리 꼭대기에서, 당신이 정말로 이것을하고 싶다면 변경 불가능한 클래스를 구성하기 위해 모든 데이터 항목을 담을 수있는 변경 가능한 도우미 클래스를 사용할 수 있다고 말하고 싶다. 헬퍼 클래스를 조금씩 초기화 한 다음, 헬퍼 클래스의 인스턴스를 전달하여 변경 불가능한 클래스를 생성하십시오. 이것이 아주 좋은 패턴인지는 모르겠습니다. –
에릭 리 퍼트 (Eric Lippert)의 "popsicle immutability"에 대한 검색 –
@AlexeiLevenkov : Lippert가 "Popsicle immutability"(아이디어의 위대한 이름 임)를 언급하는 블로그 글을 볼 수 있지만, 그가 말하는 곳은 없습니다. 그것을 구현하기위한 패턴에 대해. –