【问题标题】:Any reason for having a non-static class with static members only instead of making it static?有一个非静态类仅具有静态成员而不是使其成为静态的任何理由?
【发布时间】:2016-03-21 11:32:43
【问题描述】:

我昨天在接受采访,其中一个问题是什么是单例以及如何实现它。

MSDN's implementation

来自 MSDN 的解决方案 #1:

using System;

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

我给出了最简单的解决方案(msdn 实现的解决方案 1),而他想要线程安全的解决方案(解决方案 3)。

来自 MSDN 的解决方案 #3:

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}

让我感兴趣的是 msdn 示例中的 private 构造函数。 我不知道有这样的东西存在。

看看msdn on it

public class Counter
{
    private Counter() { }
    public static int currentCount;
    public static int IncrementCount()
    {
        return ++currentCount;
    }
}

然后我问:

为什么你会有一个只有静态成员的类,因此想要阻止它的实例被创建,因此使用私有构造函数 - 而不是使类成为静态的?!

P.S.:问题不在于单例 - 是关于描述我会选择创建一个仅具有静态成员的可实例化类的场景(因此最终创建对私有构造函数的需求)而不是使用静态类。

【问题讨论】:

  • 单例示例通常集中在“负责初始化单例的代码”上——实际上你会有实例成员,有时它会实现一个接口。
  • 你应该给他的真正答案是,你不应该为实现单例而烦恼,而是使用 IOC 容器来控制对象的生命周期。
  • 我确实想知道为什么人们仍然在编程面试中问有关单身人士的问题。
  • @YuvalItzchakov:也许它告诉了候选人申请的地方 - 他/她应该反思一下:-)
  • @Veverke - 请不要链接到外部资源,除非它是为了支持您问题中已有的内容。我们永远不知道外部链接何时会中断并使问题变得无用。

标签: .net private-constructor


【解决方案1】:

为什么你会有一个只有静态成员的类,因此会 喜欢防止创建它的实例,因此使用 私有构造函数 - 而不是将类设为静态

在静态类上使用单例的主要区别在于,您可以在前者上实现接口,然后将其直接传递而不绑定到单例的具体实现细节,而静态类则不能。

除此之外,单例实例变量需要是静态的,并且可以作为常规实例成员公开。

【讨论】:

  • 感谢 Yuval,但我看到所有的 cmets 都与单例有关......虽然这个主题是从它发展而来的,但问题是关于别的东西 - 为什么我想要一个可实例化的类只有静态成员(从而创造了需要私有构造函数的可能性)而不是拥有静态类?所以你的答案也适用吗?因为我有兴趣让那个类实现接口,而静态类不能?
  • 我通常认为你几乎永远不会想要一个只有静态成员的实例方法,这没有什么意义。私有构造函数将用于您不希望用户显式创建实例的地方。它可以是单例,也可以是对象本身的某种工厂(我不确定对象是否应该创建自己的实例,但有时会发生)。
  • 给你 +1 上面的评论,这是与提出的问题有关的评论。谢谢。
猜你喜欢
  • 2012-01-21
  • 1970-01-01
  • 2012-04-13
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多