为什么Java不具有众所周知的系统属性名称的常量?

And*_*wan 15 java api properties constants

所述java.lang.System中类定义了许多公知的特性.

例如,您可以通过查找"java.io.tmpdir"属性来获取JVM的临时目录:

... = System.getProperty("java.io.tmpdir");
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么这些属性没有被定义为常量(例如在java.lang.System类中).与使用文字字符串相比,这将更不容易出错.换句话说,我希望能够做到这一点:

... = System.getProperty(System.JAVA_IO_TMPDIR);
Run Code Online (Sandbox Code Playgroud)

任何想法为什么没有这样做?它甚至可以在未来的Java版本中添加,而不会破坏向后兼容性.还是我错过了一些明显的东西?

lot*_*har 9

我的猜测是Sun不想提交一组预定义的系统属性.如果它们未定义为容器,则可以随时添加系统属性(即使它们仅发布JDK的增量版本,如1.4.1到1.4.2).

编辑:
任何预定义的常量都必须被视为API的一部分.因此,即使改变常量的数量也是API的变化.通过不定义任何常量,允许Sun在不引入API更改的情况下定义新的系统属性.


Lac*_*lan 9

System.getProperties()下记录的所有属性都是标准化的 - 每个Java SE实现都必须提供它们.Java 7没有理由不能为这些标准属性名称引入常量.它不会阻止引入新的属性.我认为没有人认为值得努力(即使是对核心Java API的微不足道的补充也必须通过我认为的流程).