在单身人士中分配一次的财产 - 良好做法?

时间:2014-07-29 15:57:48

标签: c# properties singleton

考虑一个内部包含属性Name的类。我希望将类实现为单例,并且我希望Name只能设置一次(因此它可以分配一次但以后不会更改)。

我应该使用构造函数分配它(并且只给它get访问器,而不是set)或者创建一个单独的"实例变量" for" Name"和一个只能工作一次的正确方法?

第一个选项会强制我每次调用时都会将string参数传递给GetInstance()方法,而第二个选项对我来说似乎不太优雅(因为我不会这样做)我知道" Name"是否已经设置 - 所以我每次尝试获取实例时都需要调用此方法。)我采取了错误的方法吗?对于这种情况有没有好的做法?

1 个答案:

答案 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的有效值,但不关心它来自何处。如果可能的话,我认为这将是我的首选