是否所有编译时常量都内联?

2022-09-01 20:10:55

假设我有一个这样的类:

class ApplicationDefs{
public static final String configOption1 = "some option";
public static final String configOption2 = "some other option";
public static final String configOption3 = "yet another option";
}

我的应用程序中的许多其他类都使用这些选项。现在,我想单独更改其中一个选项,并仅部署已编译的类。但是,如果这些字段在消费者类别中是内联的,这是不可能的,对吧?

是否有任何选项可以禁用编译时常量的内联?


答案 1

您可以使用 String.intern() 来获得所需的效果,但应该注释您的代码,因为没有多少人知道这一点。即

public static final String configOption1 = "some option".intern();

这将阻止编译时内联。由于它指的是编译器将放置在perm中的完全相同的字符串,因此您不会创建任何额外的字符串。

作为替代方案,您始终可以做到

public static final String configOption1 = "some option".toString();

但是,这不会使用编译的实习生字符串,它将在旧一代上创建一个新字符串。没什么大不了的,可能更容易阅读。无论哪种方式,由于这有点奇怪,您应该注释代码以告知维护它的人您正在做什么。

编辑:找到另一个 SO 链接,该链接提供了对 JLS 的引用,以获取有关此内容的更多信息。何时对字符串文本使用 intern()


答案 2

不,恐怕这是JLS的一部分。这在Java Puzzlers中简要地触及了一下,但我手头没有我的副本。

我想你可能会考虑在属性文件中定义这些常量,并让类定期加载它们。

参考资料: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313


推荐