클래스의 인스턴스가 변경 될 것으로 예상되지 않을 때 더 많은 불변 유형을 사용 하고 있습니다 . 더 많은 작업이 필요하지만 (아래 예 참조) 멀티 스레드 환경에서 유형을보다 쉽게 사용할 수 있습니다.
동시에 변경 가능성이 다른 사람에게 도움이되지 않더라도 다른 응용 프로그램에서는 변경 불가능한 유형을 거의 볼 수 없습니다.
질문 : 왜 다른 응용 프로그램에서 불변 유형이 거의 사용되지 않습니까?
- 불변 유형의 코드를 작성하는 것이 더 길기 때문입니다.
- 아니면 뭔가 빠졌고 불변 유형을 사용할 때 몇 가지 중요한 단점이 있습니까?
실생활의 예
다음 Weather
과 같은 RESTful API에서 얻는다고 가정 해 봅시다 .
public Weather FindWeather(string city)
{
// TODO: Load the JSON response from the RESTful API and translate it into an instance
// of the Weather class.
}
우리가 일반적으로 보는 것은 (코드를 줄이기 위해 줄 바꿈과 주석이 제거 된 것입니다) :
public sealed class Weather
{
public City CorrespondingCity { get; set; }
public SkyState Sky { get; set; } // Example: SkyState.Clouds, SkyState.HeavySnow, etc.
public int PrecipitationRisk { get; set; }
public int Temperature { get; set; }
}
반면에 Weather
API에서 가져온 다음 수정하는 것이 이상 할 것 입니다. 실제 세계의 날씨를 변경 Temperature
하거나 Sky
변경 CorrespondingCity
하지 않으며 변경 도 의미가 없습니다.
public sealed class Weather
{
private readonly City correspondingCity;
private readonly SkyState sky;
private readonly int precipitationRisk;
private readonly int temperature;
public Weather(City correspondingCity, SkyState sky, int precipitationRisk,
int temperature)
{
this.correspondingCity = correspondingCity;
this.sky = sky;
this.precipitationRisk = precipitationRisk;
this.temperature = temperature;
}
public City CorrespondingCity { get { return this.correspondingCity; } }
public SkyState Sky { get { return this.sky; } }
public int PrecipitationRisk { get { return this.precipitationRisk; } }
public int Temperature { get { return this.temperature; } }
}
{get; private set;}
있으며 변경 가능한 변수 도 생성자가 있어야합니다. 모든 필드가 항상 설정되어야하고 왜 강제하지 않습니까? 이 두 가지를 합리적으로 적절히 변경하면 기능과 LoC 패리티가됩니다.