静态变量与单例

时间:2018-07-25 08:47:31

标签: java web-services design-patterns spring-bean

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

  

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

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

static variable存储在哪里?

您有2个选项:

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

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

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

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

您再次有2个选项:

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

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

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

结论

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