代码之家  ›  专栏  ›  技术社区  ›  Sergei Podlipaev

静态变量与单变量

  •  0
  • Sergei Podlipaev  · 技术社区  · 6 年前

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

    4 回复  |  直到 6 年前
        1
  •  1
  •   Lino    6 年前

    我应该对整个应用程序使用静态服务变量还是将服务作为单例

    这要看情况。你必须问自己两个问题才能得出答案:

    那在哪 static variable 存储?

    你有两个选择:

    1. 宣布 final class Services 所有可用的服务 public static final 变量。
    2. 在每个a级服务中创建 公开静态决赛 变量,调用 INSTANCE

    你可以看到第一点是所有的类都在同一个地方。可能会变得聚集,不可读和不太容易维护。

    在第二点上,你几乎接近了单重案件。

    我需要惰性地还是急切地初始化服务?

    你还有两个选择:

    1. 懒散地:使用 静态保持器模式 在第一次使用singleton时惰性地初始化它
    2. 急切地:创造一个 公开静态决赛 变量并直接创建实例。

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

    对于第二点,你会发现它就像第一个问题的第二点。

    结论

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

        2
  •  3
  •   Bharat Satija    6 年前

    如果您希望有一些实用方法或常量变量,则应该选择Static,而singleton是在类可以有状态并且状态可以更改(但still object是一个)时出现的。

        3
  •  1
  •   Keaz    6 年前

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

        4
  •  1
  •   Damith    6 年前

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

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

    这个UserManagementService是一个spring服务,它将是spring上下文中的一个singleton bean,其配置通过UserManagementConfig类加载。 这样你就有了我上面提到的优势。 因此,如果创建静态实例,则无法执行此操作。所以我建议最好使用Spring MVC。