Почему Java не имеет констант для имен известных системных свойств?
Класс java.lang.System определяет число известных свойств.
Например, вы можете получить временную директорию JVM, просмотрев свойство java.io.tmpdir:
... = System.getProperty("java.io.tmpdir");
Я не понимаю, почему эти свойства не определены как константы (например, в классе java.lang.System). Это было бы намного менее подвержено ошибкам, чем использование литералов. Другими словами, я хотел бы иметь возможность сделать это:
... = System.getProperty(System.JAVA_IO_TMPDIR);
Любые идеи, почему это не было сделано? Его можно даже добавить в будущую версию Java, не нарушая обратной совместимости. Или я пропущу что-то очевидное?
Ответы
Ответ 1
Все свойства, описанные в System.getProperties(), стандартизированы - каждая реализация Java SE должна обеспечивать их. Нет причин, по которым Java 7 не может вводить константы для этих стандартных имен свойств. Это не помешало бы внедрению новых свойств. Я думаю, что это просто никто не думал, что это стоит усилий (даже тривиальные дополнения к основным API Java должны проходить через процессы, которые я думаю).
Ответ 2
Я предполагаю, что Sun не захотела зафиксировать предопределенный набор системных свойств. Если они не определены как константы, они могут добавлять свойства системы в любое время (даже если они только освобождают инкрементную версию JDK, например, от 1.4.1 до 1.4.2).
Edit:
Любые предопределенные константы должны рассматриваться как часть API. Таким образом, даже изменение количества констант - это изменение API. Не определяя никаких констант, Sun может определять новые системные свойства без внесения изменений API.
Ответ 3
Удивительная Google Guava library ввела константы для свойств системы в последнее время: см. http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/StandardSystemProperty.html
Ответ 4
Для полноты Apache commons lang имеет класс SystemUtils, который предоставляет общие константы и предопределенные методы.
Это существует с нескольких лет, и шансы хорошие, вы уже используете commons lang (2 или 3).
SystemUtils.getUserHome();
SystemUtils.getJavaIoTmpDir();
SystemUtils.JAVA_IO_TMPDIR;
SystemUtils.USER_HOME;
Ответ 5
Какая разница между "literal"
и a LITERAL
?
Два символа: "
и "
.
Не могу понять, зачем придумывать сложный набор LITERAL
, когда "literal"
работает так же хорошо.