gpt4 book ai didi

java - Spring 支持或反对 @service 上的私有(private)静态最终不可变的激励

转载 作者:行者123 更新时间:2023-12-02 13:29:12 25 4
gpt4 key购买 nike

我对专业软件开发领域的编程相当陌生,我的同事讨论了如何在 Spring @Service 带注释的类中使用如下所示的字段:

private static final Map<Key, Value> someMap;
static {
Map<Key, Value> map = new HashMap<>();
map.put(aKey, aValue);
someMap = Collections.unmodifiableMap(map);
}

在以下前提下,我可以在不影响某些安全/功能的情况下省略任何关键字吗:

  • 除非由有权访问源代码的程序员直接修改,否则不得以任何方式修改 map
  • map 不适用于外部任何类(class)
  • 包含映射的类被注释为具有 SpringBoot 默认范围的服务
  • 编辑假设键和值都是枚举值,其中没有任何其他信息或功能。
  • 编辑 Map 旨在作为包含 switch case 语句的方法的更好维护的替代方案
  • 编辑该 map 绝不可供任何其他类别访问

与使用类似方法相比,这种方法有哪些优点或缺点:

private final Map<Key, Value> someMap;

public MyClass() {
Map<Key, Value> map = new HashMap<>();
map.put(aKey, aValue);
someMap = Collections.unmodifiableMap(map);
}

最佳答案

您应该问自己的主要问题是您将创建该类的多少个实例。

一个类实例

@Service 的默认范围是单例,因此无论您将映射创建为静态成员还是常规成员,都没有太大区别。 map 将只有一个实例,唯一的区别在于其初始化发生的那一刻。对于单例作用域,没有真正的理由使用静态成员。

但是,通过将映射创建为类的常规成员,您可以避免将来出现静态成员的一些问题。例如,如果您想对您的类进行单元测试并为某些测试场景 stub 映射,那么静态成员会出现更多问题。如果您需要,静态成员无法从依赖注入(inject)和 @Value 注入(inject)中受益。

许多类实例

如果您更改 @Service 类的默认范围,并且希望所有实例共享一些私有(private)内部状态,那么在某些情况下使用静态成员可能是一个合理的选择。您必须记住,实例可以同时访问或修改映射,因此您应该确保在设计类时考虑到线程安全。

关于java - Spring 支持或反对 @service 上的私有(private)静态最终不可变的激励,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43251472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com