#java
Вопрос:
Непроверенный код (просто размышляю вслух), но я думаю, что должен быть более элегантный способ сделать это.
Итак, есть три способа установить переменную:
- просто назначьте его
- прочитайте его из файла свойств (возможно, его там нет)
- прочитайте его из командной строки (может быть более одного аргумента или ни одного).
Большее число имеет приоритет. Как бы я подошел к этому?
public static final String APP_DOWNLOAD_PATH;
[...]
// If download path is not defined in config.properties, set it to the app dir.
String download = properties.getProperty("download", System.getProperty("user.dir"));
// Override if download path is set via command line.
String override = null;
try {
override = System.getProperty("download");
} catch (NullPointerException | IllegalArgumentException ok) {
// property is either not found or empty.
}
String APP_DOWNLOAD_PATH = (override == null || override.isEmpty()) ? download : override;
E: Добавлены ограничения.
Ответ №1:
Прямой подход, на мой взгляд, является лучшим. Например:
public static final String APP_DOWNLOAD_PATH = "foo";
public static void main(String... args) {
String dwnPath = null;
if(args.length > 0) {
dwnPath = args[0];
} else if(System.getProperty("download") != null) { // don't need try-catch, "download" is not null and not empty ("")
// not DRY at all
dwnPath = System.getProperty("download");
} else {
dwnPath = APP_DOWNLOAD_PATH;
}
// rest of program
}
Вышесказанное также может быть извлечено в его собственную функцию, ведущую к одному лайнеру:
String dwnPath = getDownloadPath(args, System.getProperty("download"), APP_DOWNLOAD_PATH);
Извлеченная функция также может быть более элегантной, чем приведенный выше код:
/** Documentation */
public static String getDownloadPath(String[] args, String property, String default) {
return (args.length > 0) ? args[0] : (property != null) ? property : defau<
}
Комментарии:
1. Это работает только тогда, когда задан только один аргумент командной строки, верно? Если это так, я должен был поставить это в качестве ограничения в своем вопросе.
![]()
2. Да, но это просто потому, что я только проверяю
args.length
, больше ли, чем0
. Это можно легко изменить, чтобы учесть другие обстоятельства.
Ответ №2:
Если можно использовать внешнюю библиотеку, то этот метод apache commons может быть полезен —
StringUtils.firstNonEmpty(System.getProperty("download"),
properties.getProperty("download", System.getProperty("user.dir")),
"some value");
Комментарии:
1. Что происходит, когда System.getProperty() создает исключение?
2. У вас может быть другой собственный служебный метод для него, который возвращает значение null, когда свойство отсутствует.
3. @Brazen
System.getProperty(...)
создаст исключение только в том случае, если вы передадите егоnull
или пустую строку (""
), или в редком случае aSecurityException
, что, если вы хотите сделать свой код герметичным, я думаю, вам следует учитывать это.4. @Jonyhenly О, так это из-за аргумента, а не его возвращаемого значения!