当一个单例类优先于只有静态方法和私有默认构造函数的类时?
请投票。
答案 0 :(得分:5)
当一个单例类比只有静态方法和私有默认构造函数的类更受欢迎时?
当您需要 实例时。例如,传递方法参数。
答案 1 :(得分:5)
使用单例来更好地控制何时发生初始化。对于静态类,任何初始化都必须在类加载时,您无法控制。例如,对静态最终MEMBER的简单引用将触发类加载。使用单例,初始化可以简单地推迟到更晚 - 通常,直到第一次使用。
延迟初始化的原因可能是:
使用单例来提高可测试性。如果你需要制作一些单例的模拟对象(广义上)以测试其客户端,一种方法是在其使用上放置一个接口,并提供一个不同类的测试单例,但实现相同的接口。
使用单例也可以简化初始化测试。
当您可能需要调试初始化时使用单例。静态初始化的堆栈跟踪可能令人费解。调试也可能令人费解。如果类早期加载,它可能会在main()中第一行的断点被触发之前中断。
答案 2 :(得分:1)
如果您需要存储某个州,则可以使用单身人士。例如,如果您的类需要从属性文件加载某些配置。
答案 3 :(得分:1)
只有静态方法的主要原因是你只需要一个工具箱来组合一些功能。
我使用单身主要有两个原因:
答案 4 :(得分:0)
静态方法不是动态的,这与单例类实例有很大不同。因此,如果您需要从类扩展并覆盖某些方法,则第二种方法将无效。
对于第二种方式,您可能需要使用一些可能导致内存泄漏的静态引用。
答案 5 :(得分:0)
我想说单例类只在一种情况下是首选:当你有一些系统存储的配置时,很少(如果有的话)需要刷新。
作为我的意思的一个例子,我的一个应用程序中有一个单例模式,代表用户互联网连接的NAT设备。此应用程序用于桌面使用,因此很少(如果有的话)看到互联网连接的变化。据推测,用户可以将他们的笔记本电脑带到一个新的位置,这会改变;但是,有一种方法可以在此事件中重新创建状态,但这种状态很少被更改,可能需要几秒钟才能初始化。
这需要保持昂贵,不经常更改和全局适用的状态,最好通过应用程序作用域bean(我的首选选项)或单例模式bean来完成。静态方法不能保留这种状态,尽管你也可以使用静态字段来实现这一点,以制作伪单例。 (不确定是否有更好的名字 - 可能)
一般来说,我建议如果你可以避免使用单独的模式,因为它会使重用变得更加困难。如果您正在使用CDI框架,请在应用程序级别对bean进行范围化,以便于重用。 (这可能不是你的担忧 - 如果没有,你可以放心地忽略这个建议)