クラスのインスタンスが変更されることを期待されていないとき、私はますます不変の型を使用しているようです。より多くの作業が必要になります(以下の例を参照)が、マルチスレッド環境での型の使用が簡単になります。
同時に、可変性がだれにも利益をもたらさない場合であっても、他のアプリケーションで不変型が表示されることはほとんどありません。
質問:不変の型が他のアプリケーションで使用されることがほとんどないのはなぜですか?
- これは、不変型のコードを書くのが長いためです。
- または、私は何かを見逃していて、不変の型を使用するときにいくつかの重要な欠点がありますか?
実生活からの例
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;}
でプロパティを宣言することでインスタンスレベルの変数を削除できます。また、可変のプロパティにもコンストラクタが必要です。これらのフィールドはすべて常に設定する必要があり、それを強制しないのはなぜですか?これらの2つの完全に合理的な変更を行うことで、機能とLoCパリティが実現します。