让我们这样说:
我可以很容易地生成一个完全符合标准的Java编译器,在
.class给定相同
.java文件的情况下,它永远不会两次生成相同的文件。
我可以通过调整各种字节码构造或通过简单地在我的方法中添加多余的属性(允许)来做到这一点。
鉴于该 规范 并不 要求 编译器生成的字节对字节相同的类文件,我会 避免依赖 这样的结果。
但是 ,我检查过几次,使用相同的编译器和相同的开关(和相同的库!)编译相同的源文件 确实会 得到相同的
.class文件。
更新: 我最近偶然发现了关于Java 7 中
switchon
的实现的一篇有趣的博客文章
String。在此博客文章中,有一些相关的部分,我将在这里引用(重点是我的):
为了使编译器的输出可预测和可重复,这些数据结构中使用的映射和集合是
linkedHashMaps和linkedHashSets,而不是justHashMaps和HashSets。就给定编译期间 生成的代码的功能正确性而言 ,
使用HashMap和HashSet会很好;迭代顺序无关紧要。但是, 我们发现使javac输出不随系统类的实现细节而变化是有益的。
这很清楚地说明了这个问题:只要编译器符合规范,就 不需要 以确定性的方式进行操作。但是,编译器开发人员意识到 尝试 通常
是一个好主意(前提是它可能不太昂贵)。 __



