Java 如何决定是使用singleton还是使用带有静态方法的类?

Java 如何决定是使用singleton还是使用带有静态方法的类?,java,singleton,Java,Singleton,在这种情况下,我需要阅读LDAP中的一些详细信息,比如所有用户的列表。这种情况应该只发生一次。稍后,我将使用此列表执行一些其他操作,例如向特定实例的活动用户集发送一些警报。此方法将从多个线程调用,并用于各种目的。我只需要确保向LDAP发送一个请求 我使用了一个单例类来实现这一点,在对象创建期间,我将从LDAP获取详细信息。通过使用此对象,我将找到该应用程序的活动用户列表 在这种情况下: 我真的需要创建一个单例类吗 我可以通过在LDAP读取方法中添加一个检查来确保列表在请求之前是空的,从而使用一个

在这种情况下,我需要阅读LDAP中的一些详细信息,比如所有用户的列表。这种情况应该只发生一次。稍后,我将使用此列表执行一些其他操作,例如向特定实例的活动用户集发送一些警报。此方法将从多个线程调用,并用于各种目的。我只需要确保向LDAP发送一个请求

我使用了一个单例类来实现这一点,在对象创建期间,我将从LDAP获取详细信息。通过使用此对象,我将找到该应用程序的活动用户列表

在这种情况下:

  • 我真的需要创建一个单例类吗
  • 我可以通过在LDAP读取方法中添加一个检查来确保列表在请求之前是空的,从而使用一个包含所有静态方法的类来实现这一点吗?它将如何处理多个线程

  • 我对它的理解是,使用单例可以对它的变量执行初始化,这些变量可能相互依赖和/或外部数据

    例如,如果使用静态变量,则无法轻松地将数据从文件预加载到这些项中(或者在另一个对象中进行预加载,如果需要更新数据,则调试会更加困难)

    我肯定有很多更聪明的人有更好的观点,但我总是选择单例而不是静态变量。我只对可能在构建时更改的定义使用静态,并保存单例引用

    同样关于线程,使用单例可以在必要时放入互斥,这样您就知道可以安全地修改数据。如果使用静力学,您可能一开始就不需要此功能,您可能会发现以后需要它,并且很难进行恢复


    它主要是一种编码风格,希望这有助于您做出选择。

    无论您决定实现单例模式还是静态类,注意事项基本相同。在这两种情况下,您都必须确保正确地传递数据竞争(可能带有锁或任何适合用例的机制)——这在两种情况下都是可能的,但我认为如果您使用单例,Java会对您有利。这两种方法之间最本质的区别是它们的变量的初始化时间和您对初始化的控制(这里单例获胜)


    也就是说,在这两种情况下,您都将在程序中插入全局状态。您可能已经听过很多次了,但值得重复:使用全局状态不是一个好主意,尤其是在多线程应用程序中。

    使用单例而不是静态变量几乎总是更好的做法。单例是真正的面向对象的方法,它允许您实现某些接口,并派生该类


    不管你在做什么(单例或静态变量),如果你的代码对你很重要,那么它应该是线程安全的。

    因为我还没有对Theodoros Chatzigiannakis答案发表评论的权限,下面是我的答案/评论。正如他所说,通过使用单例变量或静态变量,您引入了全局状态,这很难为其构建测试,并且可能会在代码中隐藏依赖项。来自一个有经验的人:

    创建该类的一个实例并调用LDAP一次,而不是单例。“once”的限制可以在类中进行监视,并在错误调用时引发异常。

    “如果代码对您很重要,则代码应该是线程安全的”。如果您希望代码在多线程环境中正确运行,则代码应该是线程安全的。。。