考虑一个内部包含属性Name
的类。我希望将类实现为单例,并且我希望Name
只能设置一次(因此它可以分配一次但以后不会更改)。
我应该使用构造函数分配它(并且只给它get
访问器,而不是set
)或者创建一个单独的"实例变量" for" Name"和一个只能工作一次的正确方法?
第一个选项会强制我每次调用时都会将string
参数传递给GetInstance()
方法,而第二个选项对我来说似乎不太优雅(因为我不会这样做)我知道" Name"是否已经设置 - 所以我每次尝试获取实例时都需要调用此方法。)我采取了错误的方法吗?对于这种情况有没有好的做法?
答案 0 :(得分:1)
每次将值传递给getInstance()
的问题是所有调用类都必须知道Name的值来自何处以及如何获取它。也许他们都有这种访问权限,但随后所有调用者都知道它的值,这使得将这些数据存储在单例对象上是多余的。
假设有些来电者知道价值,而其他人不知道,你可以使用类似于你自己建议的方式:
public class MySingleton
{
// Singleton properties omitted
private string name;
public string name
{
get{return this.name;}
set
{
if(String.IsNullOrEmpty(this.name))
name = value;
// The exception could be left out, depending on how critical this is
else
throw new exception("The property 'name' can only be set once");
}
}
}
这假设null或String.Empty
都不是您的属性的有效分配,它仍然不是最优雅的解决方案,所以也许完全不同的方法。
也许单例的构造函数可以获取所需的值,而不是传递值:
public MySingleton()
{
name = configuration.getName(); // or wherever it is coming from
}
这样调用类总是可以假设单例具有Name
的有效值,但不关心它来自何处。如果可能的话,我认为这将是我的首选