繁体   English   中英

静态变量与单例

[英]Static variable vs singleton

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

如果您想拥有一些实用的方法或常量变量,则应选择使用Static;而当类可以具有状态并且状态可以更改(但对象仍然是一个)时,Singelton就会出现。

将服务创建为单例,这样可以在运行时获得更大的灵活性,因为您可以注入服务的任何实现而无需更改代码。 如果您的想法是使用服务类共享某些变量,则将其标记为最终变量。

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

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

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

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

这取决于。 您必须问自己两个问题才能得出答案:

static variable存储在哪里?

您有2个选项:

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

您会看到第一点将所有类都放在同一位置。 可能会变得集群化,难以理解并且很难维护。

第二点,您几乎接近单例情况。

我需要懒惰还是急于初始化服务?

您再次有2个选择:

  1. 懒惰:第一次使用静态持有人样式来懒惰初始化单例
  2. 急切地:在服务类中创建一个public static final变量,然后直接创建一个实例。

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

对于第二点,您会看到这就像第一个问题的第二点。

结论

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM