Установите значение по умолчанию, если оно существует в конфигурации.свойства используйте это, если переопределено в командной строке используйте это

#java

Вопрос:

Непроверенный код (просто размышляю вслух), но я думаю, что должен быть более элегантный способ сделать это.

Итак, есть три способа установить переменную:

  1. просто назначьте его
  2. прочитайте его из файла свойств (возможно, его там нет)
  3. прочитайте его из командной строки (может быть более одного аргумента или ни одного).

Большее число имеет приоритет. Как бы я подошел к этому?

 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 или пустую строку ( "" ), или в редком случае a SecurityException , что, если вы хотите сделать свой код герметичным, я думаю, вам следует учитывать это.

4. @Jonyhenly О, так это из-за аргумента, а не его возвращаемого значения!