我需要从LDAP中读取一些细节,比如所有用户的列表。这应该只发生一次。稍后我会将此列表用于其他一些操作,例如向特定实例的活动用户集发送一些警报。此方法将从多个线程调用并用于各种目的。我需要确保的只是一个请求被发送到LDAP。
我使用单例类来实现这一点,在对象创建过程中,我将从LDAP获取详细信息。通过使用此对象,我将找到该应用程序的活动用户列表。
在这种情况下:
答案 0 :(得分:1)
我对它的看法是使用单例允许你对它可能依赖于彼此和/或外部数据的变量进行初始化。
如果使用静态变量,则不能轻易地将文件中的数据预加载到这些项中(或者在另一个对象中执行此操作,如果您需要更新它,则会使调试变得更加困难。)
我确信有很多聪明的人有更好的观点,但我总是选择单身而不是静态变量。我只使用静态定义,我可以在构建时更改并保存单例引用。
同样关于线程,使用单例允许您在必要时放入互斥锁,以便您知道可以安全地修改数据。如果使用静力学,你可能不需要这种能力,你可能会发现你以后需要它,并且变得更难以适应。
这主要是一种编码风格,希望这有助于您做出选择。
答案 1 :(得分:0)
无论您决定实施单例模式还是静态类,警告几乎都是一样的。在这两种情况下,你都必须确保数据竞赛是正确的(可能是使用锁或任何适合用例的机制) - 这在两种情况下都是可能的,但是如果你使用单例,我会说Java对你有利。 。这两种方法之间最本质的区别在于它们的变量初始化时间以及对初始化的控制(单例在这里获胜)。
话虽如此,在这两种情况下,您都要将全局状态插入到您的程序中。您可能已经多次听过它,但值得重复一遍:拥有全局状态并不是一个好主意,特别是在多线程应用程序中。
答案 2 :(得分:0)
在静态变量上使用单例几乎总是更好的做法。单身人士是真正的面向对象的方法,它允许你实现一些接口,并导出后一类。
如果您的代码对您来说很重要,那么您的代码(单件或静态变量)应该是线程安全的。
答案 3 :(得分:0)
由于我还没有对Theodoros Chatzigiannakis的回答发表评论,这是我的回答/评论。正如他所说,通过使用Singleton或静态变量,您将引入难以构建测试的全局状态,并可能隐藏代码中的依赖关系。来自经验丰富的家伙:Google Tech Talk video
而不是Singleton,创建一个类的实例并调用LDAP一次。可以在类中监视“一次”的限制,并在错误调用时抛出异常。