当不希望更改类的实例时,我看到自己使用越来越多的不可变类型。它需要做更多的工作(请参见下面的示例),但是可以更轻松地在多线程环境中使用这些类型。
同时,即使可变性不会使任何人受益,我也很少在其他应用程序中看到不可变类型。
问题:为什么在其他应用程序中很少使用不可变类型?
- 这是因为编写不可变类型的代码时间更长,
- 还是我错过了某些东西,使用不可变类型时有一些重要的缺点?
现实生活中的例子
假设您是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奇偶校验。