关于使用"私有静态最终字符串"的最佳实践singeltons中的变量

时间:2018-05-25 12:58:09

标签: java spring

在单身人士中,使用

有哪些缺点和优点
private static final String QUERY = "some valid query";

private final String QUERY = "some valid query";

3 个答案:

答案 0 :(得分:1)

在您的情况下,您有一个不可变对象。

声明final String s = "foo";static final String s = "foo";并没有太大变化,因为这是一个常量。它永远不会改变 常识告诉我将其设置为static以限制创建的实例数。 (请注意,由于字符串池,仍然只能创建一个String

如果你要求可变对象,这是不同的。例如,List声明它final只会阻止您稍后重新初始化该变量,但不会阻止内容更改。

private static final List<String> list1 = new ArrayList<>();
private final List<String> list2 = new ArrayList<>();

这将给出两个列表,一个对每个实例(static)都是通用的,另一个是实例的成员。

list1.add("foo");

将在String中添加list1,可从任何

的实例访问
list2.add("foo");

只会为一个实例添加String

在这种情况下,声明它static会产生影响。

实例成员的每个点都是基于在声明期间初始化的变量完成的,而不是在构造函数中完成的。

private final String s;

public MyClass(String s){
    this.s = s;
}

这种情况不同,因为这不是常量,每个实例将使用不同的String值。

答案 1 :(得分:0)

使用Spring视角,大多数豆子都是单身,没有区别。另一点是,您应该编写非特定于框架的代码,然后是最佳实践。 Spring是java,但java不是Spring(我希望你能理解)。

答案 2 :(得分:0)

“静态最终”方法做了一些事情。

  • 仅创建一个由所有实例共享的字段
  • 在加载类时创建字段
  • 该字段无法修改
  • 其他类可以访问公共字段而无需创建实例

这是一种非常常见的方法,有些地方是最好的替代方法,例如为类创建Logger实例。至于String常量。

在您的情况下,String interning将导致运行时只创建一个将由包含类的每个实例引用的String实例,并且对于单例,只有一个容器实例。因此,没有性能优势。

话虽如此,使用常量被认为是最佳实践。