繁体   English   中英

什么时候单例类优于仅具有静态方法的类?

[英]when is a singleton class preferred over a class that has only static methods?

什么时候单例类比仅具有静态方法和私有默认构造函数的类优先?

请投票。

什么时候单例类比仅具有静态方法和私有默认构造函数的类优先?

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

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

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

  • 它很贵,而且您在该课程中并不总是需要它
  • 您必须先初始化一些其他资源(例如,数据库连接),然后才能进行初始化。 在这种情况下,懒惰实例化的单例通常会提供正确的操作顺序,而没有任何显式的控制-如果在其他资源初始化之后才引用它,则所有操作都是免费的。

使用单例来提高可测试性。 如果您需要为单例创建某种模拟对象(广义上)以测试其客户端,则一种方法是使用其接口,并提供不同类的测试单例但实现相同的接口。

使用单例也使初始化测试更加容易。

当您可能需要调试初始化时,请使用单例。 来自静态初始化的堆栈跟踪可能令人困惑。 调试也可能令人费解。 如果该类过早加载,则它可能在甚至击中main()第一行中的断点之前就中断了。

如果您有某种状态需要存储,那么单例是可行的方法。 例如,如果您的类需要从属性文件中加载某些配置。

仅拥有静态方法的主要原因是,您只需要一个工具箱即可将某些功能打包在一起。

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

  1. 构造对象真的很昂贵(时间或内存),我只想做一次。
  2. 与该类关联的数据在该类的每个实例中都必须相同。

静态方法不是动态方法,这与单例类实例大不相同。 因此,如果您需要从类扩展并重写某些方法,则第二种方法将行不通。

第二种方法,您可能需要使用一些静态引用,这可能会导致内存泄漏。

我会说单例类仅在以下情况下才是首选:当您要存储系统范围内的某些配置时,很少(如果有的话)需要刷新。

作为我的意思的示例,我的一个应用程序中有一个单例模式,它表示用户互联网连接的NAT设备。 此应用程序仅供桌面使用,因此很少(如果有的话)看到互联网连接发生变化。 大概用户可以将笔记本电脑搬到新的位置,并且情况会有所变化; 但是,有一种方法可以在此事件中重新创建状态,但是这种状态很少更改,可能需要花费几秒钟来初始化。

这需要保持昂贵,不经常更改的状态,并且全局适用的状态最好由应用程序范围的Bean(我的首选)或单例模式Bean来完成。 静态方法不能很好地保存这种状态,尽管您也可以使用静态字段来完成此操作以创建伪单例。 (不确定是否有更好的名称-可能)

通常,我的建议是如果可以避免,则不要使用类似单例的模式,因为这样会使重用更加困难。 如果您使用的是CDI框架,请在应用程序级别对bean进行范围划分,以便于重新使用。 (这可能不是您的担心-否则,您可以放心地忽略此建议)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM