静态变量与单例

Static variable vs singleton

我正在制作 Java REST 应用程序。我想知道我应该如何实现我的服务——我应该为整个应用程序使用静态服务变量,还是像在 Spring MVC 中那样将服务作为单例。单例对象和申请时只初始化一次对象有区别吗?

将服务创建为单例,这样您就可以在运行时获得更大的灵活性,因为您可以在不更改代码的情况下注入服务的任何实现。如果您的想法是使用服务 class 共享一些变量,那么将它们标记为最终变量。

基本上,我们在系统中创建对象单例的事实是,我们需要确保除了我们创建的对象之外不会创建其他对象。造成单例对象的原因可能有很多,比如安全漏洞、资源挂起问题等等。但是仍然没有这样的方法,这只是像那样做这件事的正确方法。但是使用 Spring MVC 有它自己的优势,我们不需要管理实例,因为它已经被 spring 处理过。例如,当涉及到服务时,您可能需要将一些配置加载到服务才能运行。通过使用 Spring MVC bean,可以在 运行 时间内更改配置而无需重新部署。

@Service
@RefreshScope
@EnableConfigurationProperties(UserManagementConfig.class)
public class UserManagementService
{

此 UserManagementService 是一个 spring 服务,它将是 spring 上下文中的单例 bean,其配置通过 UserManagementConfig class 加载。 这样你就有了我上面提到的优势。 所以如果你创建静态实例,你不能这样做。所以我的建议是更好地使用 Spring MVC。

如果你想要一些实用方法或常量变量,你应该选择静态,而当 class 可以有状态并且状态可以改变(但对象仍然是一个)时,Singelton 就出现了。

should I use static service variables for whole application or make services as singletons

视情况而定。你必须问自己两个问题才能得出答案:

static variable 存储在哪里?

您有 2 个选项:

  1. 声明一个 final class Services,它将所有可用服务保存为 public static final 变量。
  2. 在每个服务 class 中创建一个 public static final 变量,称为 INSTANCE

您会看到第一个点的所有 class 都在同一个地方。可能会聚集在一起,不可读且不太容易维护。

对于第二点,您几乎接近单身人士的情况。

我需要延迟初始化服务还是急切初始化服务?

您又有 2 个选择:

  1. Lazily:使用static holder pattern在第一次使用时懒惰地初始化单例
  2. Eagerly: 在服务中创建一个public static final变量class并直接创建一个实例。

第一点有其优点。如果您需要分配资源或需要进行任何其他“繁重”操作。这有效,并且是线程安全的

对于第二点,你看到它就像第一个问题的第二点。

结论

如前所述,这取决于用例。我可能会一直使用单例。因为这样所有关于它的状态和可用性的逻辑都保存在一个地方。