静态变量与单例
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 个选项:
- 声明一个
final class Services
,它将所有可用服务保存为 public static final
变量。
- 在每个服务 class 中创建一个
public static final
变量,称为 INSTANCE
您会看到第一个点的所有 class 都在同一个地方。可能会聚集在一起,不可读且不太容易维护。
对于第二点,您几乎接近单身人士的情况。
我需要延迟初始化服务还是急切初始化服务?
您又有 2 个选择:
- Lazily:使用static holder pattern在第一次使用时懒惰地初始化单例
- Eagerly: 在服务中创建一个
public static final
变量class并直接创建一个实例。
第一点有其优点。如果您需要分配资源或需要进行任何其他“繁重”操作。这有效,并且是线程安全的
对于第二点,你看到它就像第一个问题的第二点。
结论
如前所述,这取决于用例。我可能会一直使用单例。因为这样所有关于它的状态和可用性的逻辑都保存在一个地方。
我正在制作 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 个选项:
- 声明一个
final class Services
,它将所有可用服务保存为public static final
变量。 - 在每个服务 class 中创建一个
public static final
变量,称为INSTANCE
您会看到第一个点的所有 class 都在同一个地方。可能会聚集在一起,不可读且不太容易维护。
对于第二点,您几乎接近单身人士的情况。
我需要延迟初始化服务还是急切初始化服务?
您又有 2 个选择:
- Lazily:使用static holder pattern在第一次使用时懒惰地初始化单例
- Eagerly: 在服务中创建一个
public static final
变量class并直接创建一个实例。
第一点有其优点。如果您需要分配资源或需要进行任何其他“繁重”操作。这有效,并且是线程安全的
对于第二点,你看到它就像第一个问题的第二点。
结论
如前所述,这取决于用例。我可能会一直使用单例。因为这样所有关于它的状态和可用性的逻辑都保存在一个地方。