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

时间:2009-04-23 00:32:18

标签: java api properties constants

java.lang.System 类定义了一些well-known properties

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

... = System.getProperty("java.io.tmpdir");

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

... = System.getProperty(System.JAVA_IO_TMPDIR);

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

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:4)

答案 3 :(得分:1)

为了完整性,Apache commons lang有SystemUtils类,它提供了常见的常量和预定义的方法。

这已存在好几年了,很有可能你已经使用了公共场所(2或3)。

SystemUtils.getUserHome();
SystemUtils.getJavaIoTmpDir();
SystemUtils.JAVA_IO_TMPDIR;
SystemUtils.USER_HOME;

答案 4 :(得分:-5)

"literal"LITERAL之间有什么区别?

两个字符:""

LITERAL同样有效时,无法理解为什么还要创建一组复杂的"literal"