Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态变量vs单例_Java_Web Services_Design Patterns_Spring Bean - Fatal编程技术网

Java 静态变量vs单例

Java 静态变量vs单例,java,web-services,design-patterns,spring-bean,Java,Web Services,Design Patterns,Spring Bean,我正在制作JavaREST应用程序。我想知道我应该如何实现我的服务——我应该为整个应用程序使用静态服务变量,还是像在SpringMVC中那样将服务作为单例。在应用程序中,单例对象和只初始化一次对象之间有什么区别吗?将服务创建为单例,这样在运行时可以获得更大的灵活性,因为您可以在不更改代码的情况下注入服务的任何实现。如果您的想法是使用服务类共享一些变量,那么将它们标记为最终变量。基本上,我们在系统中将对象设置为单例的事实是,我们需要确保除了我们创建的对象之外,不会创建其他对象。创建单例对象可能有很

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

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

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

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

如果你想有一些实用方法或常量变量,你应该使用Static,而Singelton是在类可以有状态并且状态可以更改时出现的(但对象仍然是一个)

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

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

静态变量
存储在哪里?
您有两种选择:

  • 声明一个
    final类服务
    ,它将所有可用服务作为
    公共静态final
    变量保存
  • 在每个服务类中创建一个名为
    实例的
    公共静态final
    变量
  • 您可以看到,第一点将所有类放在同一个位置。可能会聚集在一起,无法阅读,并且不容易维护

    关于第二点,你几乎接近了单身的情况

    我需要懒洋洋地初始化服务还是急切地初始化服务? 您还有两个选择:

  • lazyly:第一次使用单例时,使用静态holder模式延迟初始化单例
  • 急切地:在服务类中创建一个
    公共静态final
    变量,并直接创建一个实例
  • 第一点有好处。如果您需要分配资源或需要执行任何其他“繁重”操作。这是可行的,并且是线程安全的

    对于第二点,你可以看到,这就像第一个问题的第二点

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