0

通过静态init方法初始化静态字段并确保不再调用该方法的最佳方法是什么?(在程序的生命周期内不超过一次)

这是我目前想到的一个例子,对我来说似乎很简单,但我找不到任何类似模式的例子来处理这个问题:

class Entity
{
    static Manager manager;
    static bool isInitialized;

    public static void Initialize(Manager manager)
    {
        if (isInitialized)
            throw Exception("Class Entity already initialized."
                 + "Do not call Entity.Initialize() twice.");
        isInitialized = true;
        Entity.manager = manager;

    }
}
4

6 回答 6

6

通过静态 init 方法初始化静态字段并确保不再调用该方法的最佳方法是什么?

你真的必须这样做吗?为什么您不想创建一个实例Manager并使其可用于通过依赖注入依赖它的代码?这将使您的代码更清洁:

  • 您可以使用不同的初始化路径对其进行测试
  • 您不需要对“坏”重复初始化进行任何检查
  • 您不需要构造调用代码来为此类指定单个初始化点。(当然,您可能需要为 IoC 容器做类似的事情......)
  • 您也可以让依赖于它的代码更具可测试性
  • 依赖的代码Manager将以更清晰的方式表达该依赖

我怀疑你没有找到任何类似的例子,因为它是一种反模式。

如果您确实采用当前的方法,那么您也应该尝试使其成为线程安全的......

于 2012-05-30T18:47:09.883 回答
1

不要想太多,如果这种模式适合你,那就去吧。并不总是有一个“正确”的答案,仅仅为了坚持它们而试图坚持死板的模式和实践也不是一个好主意。恕我直言。

于 2012-05-30T18:50:06.247 回答
1

很抱歉说明了这一点,但您可以使用对象初始化程序或静态构造函数。除此之外,您可以不调用该方法。严重地。为什么有人会调用一个名为initialize的方法。

你能做的就是这个。您可以使用此属性从 IntelliSense 和类似的方法中隐藏该方法。也防止它弄乱下拉列表

于 2012-05-30T18:50:58.693 回答
0

你不能只使用静态构造函数吗?

当然,您无法控制何时调用此构造函数,但不知道这是否是必需的。

http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx

于 2012-05-30T18:51:39.067 回答
0

您可能希望使用带参数的单例模式来仅公开 Manager 变量的某些功能。

class Entity
{
    private Manager _manager = null;

    public Manager manager
    {
        get
        {
            return _manager;
        }
        set
        {
            if (manager == null)
            {
                _manager = value;
            }
        }
    }
    /* rest of class */
}

现在您可以将 manager 对象用作任何变量,但重复设置不会修改值。

this.manager = new Manager(0); // sets the manager
this.manager = new Manager(1); // does nothing

现在要在构造函数中的某个地方或某个重置函数中完成模式,您可能想要做一个

this._manager = null;
于 2012-05-30T18:54:29.440 回答
0

您的实现不是线程安全的,但在其他方面是合理的。如果它打算在多线程环境中使用,请添加锁定。

在您的示例中,悬而未决的问题是如果多个调用者(可能来自多个线程)使用不同的参数调用初始化方法会发生什么。这就是使您的模式与众不同的原因,并阻止您使用明显的静态构造函数或对象初始化程序。

于 2012-05-30T18:51:09.543 回答