0

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

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

在这种情况下:

  1. 我真的需要创建一个单例类吗?
  2. 我可以通过在 LDAP 读取方法中添加检查以确保在请求之前列表为空,从而使用具有所有静态方法的类来实现此目的吗?它将如何与多个线程一起工作?
4

4 回答 4

1

我对它的看法是使用单例允许您对其可能依赖于彼此和/或外部数据的变量执行初始化。

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

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

同样关于线程,使用单例允许您在必要时放入互斥锁,以便您知道可以安全地修改数据。如果使用静力学,你可能一开始就不需要这种能力,你可能会发现你以后需要它,并且变得更难重新适应。

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

于 2013-01-21T14:38:47.210 回答
0

由于我还没有权限对 Theodoros Chatzigiannakis 的回答发表评论,这是我的回答/评论。正如他所说,通过使用单例或静态变量,您正在引入难以构建测试的全局状态,并且可能隐藏代码中的依赖关系。来自有经验的人:谷歌技术谈话视频

创建类的一个实例并调用 LDAP 一次,而不是 Singleton。“一次”的限制可以在类中被监控,并在错误调用时抛出异常。

于 2013-01-21T15:03:51.673 回答
0

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

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

于 2013-01-21T14:40:02.307 回答
0

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

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

于 2013-01-21T14:41:36.793 回答