when一个单例类比只有静态方法的类更受欢迎?

时间:2011-09-21 01:16:24

标签: java singleton

当一个单例类优先于只有静态方法和私有默认构造函数的类时?

请投票。

6 个答案:

答案 0 :(得分:5)

  

当一个单例类比只有静态方法和私有默认构造函数的类更受欢迎时?

当您需要 实例时。例如,传递方法参数。

答案 1 :(得分:5)

使用单例来更好地控制何时发生初始化。对于静态类,任何初始化都必须在类加载时,您无法控制。例如,对静态最终MEMBER的简单引用将触发类加载。使用单例,初始化可以简单地推迟到更晚 - 通常,直到第一次使用。

延迟初始化的原因可能是:

  • 它很贵,而且你并不总是需要那个班级
  • 在初始化其他资源(例如,数据库连接)之前,您无法初始化。在这种情况下,一个懒惰实例化的单例通常提供正确的操作顺序而没有任何明确的控制 - 如果在初始化其他资源之后它没有被引用,则所有内容都是免费的。

使用单例来提高可测试性。如果你需要制作一些单例的模拟对象(广义上)以测试其客户端,一种方法是在其使用上放置一个接口,并提供一个不同类的测试单例,但实现相同的接口。

使用单例也可以简化初始化测试。

当您可能需要调试初始化时使用单例。静态初始化的堆栈跟踪可能令人费解。调试也可能令人费解。如果类早期加载,它可能会在main()中第一行的断点被触发之前中断。

答案 2 :(得分:1)

如果您需要存储某个州,则可以使用单身人士。例如,如果您的类需要从属性文件加载某些配置。

答案 3 :(得分:1)

只有静态方法的主要原因是你只需要一个工具箱来组合一些功能。

我使用单身主要有两个原因:

  1. 构造对象真的很贵(时间或内存),并且 我想只做一次。
  2. 与班级相关的数据 在课堂的每个实例中都需要相同。

答案 4 :(得分:0)

静态方法不是动态的,这与单例类实例有很大不同。因此,如果您需要从类扩展并覆盖某些方法,则第二种方法将无效。

对于第二种方式,您可能需要使用一些可能导致内存泄漏的静态引用。

答案 5 :(得分:0)

我想说单例类只在一种情况下是首选:当你有一些系统存储的配置时,很少(如果有的话)需要刷新。

作为我的意思的一个例子,我的一个应用程序中有一个单例模式,代表用户互联网连接的NAT设备。此应用程序用于桌面使用,因此很少(如果有的话)看到互联网连接的变化。据推测,用户可以将他们的笔记本电脑带到一个新的位置,这会改变;但是,有一种方法可以在此事件中重新创建状态,但这种状态很少被更改,可能需要几秒钟才能初始化。

这需要保持昂贵,不经常更改和全局适用的状态,最好通过应用程序作用域bean(我的首选选项)或单例模式bean来完成。静态方法不能保留这种状态,尽管你也可以使用静态字段来实现这一点,以制作伪单例。 (不确定是否有更好的名字 - 可能)

一般来说,我建议如果你可以避免使用单独的模式,因为它会使重用变得更加困难。如果您正在使用CDI框架,请在应用程序级别对bean进行范围化,以便于重用。 (这可能不是你的担忧 - 如果没有,你可以放心地忽略这个建议)