2012-11-02 40 views
5

com.sun.org.apache.xerces.internal.impl.XMLScanner的源代码在线183和186自动实习字符串文字

183 protected final static String fVersionSymbol = "version".intern(); 

186 protected final static String fEncodingSymbol = "encoding".intern(); 

为什么“版本”“编码”明确通过使用实习生(),而它们是实习字符串文字,会得到自动实习?

+2

+1问得好!效果是一样的,但是有和没有生成的字节码是不同的。我想我们永远不会知道,除非我们直接问作者,所以这是无法回答的。我会说这是过早的优化。 – OscarRyz

回答

6

我已经追踪到revision 318617 in the Apache Xerces SVN Repository(这是此XML解析器最初开发的项目,如包名所示)的更改。

提交消息的相关部分是:

试图提高使用符号表。许多预定义的字符串是 加入到符号表每一个解析器是复位时间。对于小文件, 这将是一个重要的成本。现在,因为我们要求的字符串 字符串#实习生符号表,它足以使用字符串#实习生那些预定义 符号。这只需要执行一次。

正如您所指出的,.intern()不应该是必需的(并且应该没有可见的效果)在符合JVM实现。

我的猜测是,

  • 要么笔者不知道的事实,字符串字面量总是会扣留
  • 这是一个明智的决定,以对付可能出现异常的JVM实现

但是,在第二种情况下,我希望在评论或评论消息中注意一些。该.intern()通话

一个副作用是,初始化不再constant expressions和字段不会被其他类引用了进来将确保类XMLScanner加载及其外地读被内联。不过,我认为这并不重要。

+1

:'...每次解析器被重置时,许多预定义的字符串被添加到符号表中......现在,因为我们在符号表中为字符串调用String#intern ...对于那些预定义符号使用String#intern就足够了。这只需要执行一次。“ - 很显然,作者不希望每当解析器重置时,都将代码中的PREDEFINED String SYMBOLS一次又一次地添加到符号表中。所以作者很可能没有意识到字符串文字自动被实现的事实。 –

4

我不相信有任何好的理由,对于你确定的原因:字面总是会被自动拘留,因为defined by the String class

所有文字字符串和字符串值常量表达式拘留。字符串文字在Java™语言规范的3.10.5部分中定义。

+1

那么这是一个坏编码的例子吗? –

+2

@aLearner:我想。我可能不会那么强调,但至少如果有充分的理由这样做(我怀疑),我会期待解释它是什么。来自提交消息的 –