Лучшая практика использования системных свойств Java - PullRequest
9 голосов
/ 28 января 2009

В нашем коде используется множество системных свойств, например, «java.io.tmpdir», «user.home», «user.name» и т. Д. У нас нет никаких констант, определенных для них где-либо (как и java I думать) или любую другую умную вещь для того, чтобы иметь с ними дело, чтобы они были в виде простого текста, замусоренного по всему коду.

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

Как все используют системные свойства?

Ответы [ 7 ]

8 голосов
/ 28 января 2009

Я бы отнесся к этому так же, как к любой другой строковой константе, которую вы разбросали по всему коду, и определил бы для нее постоянную переменную. Конечно, в этом случае «java.io.tmpdir» вряд ли изменится, но вы никогда не узнаете. (Я не имею в виду, что Sun может изменить значение «java.io.tmpdir» или на какое системное свойство оно указывает, но вы можете изменить свое мнение о том, какое системное свойство вам нужно прочитать.)

Если вы используете только определенное свойство в одном классе, я бы определил константы прямо в этом классе.

private final String TEMPDIR = "java.io.tmpdir";

Если вы используете одни и те же свойства в разных классах, вы можете определить собственный статический класс для хранения наиболее часто используемых констант.

public final Class Prop {
    public static final String TEMPDIR = "java.io.tmpdir";
    ...
}

Тогда везде, где вам нужно использовать эту константу, просто вызывайте ее, используя

System.getProperty(Prop.TEMPDIR);
5 голосов
/ 19 июля 2015

SystemUtils , предоставляемый пакетом Apache Commons Lang, решает эту проблему.

SystemUtils определил константу для большинства системных свойств, которые можно получить путем поиска, например:

import org.apache.commons.lang3.SystemUtils;

class Something
{
    public static void main(String[] args){     
        System.out.println(SystemUtils.JAVA_IO_TMPDIR);
    }
}

Возможно, это более чистый способ сделать это.

4 голосов
/ 09 ноября 2012

Я думаю, что в объектно-ориентированном программном обеспечении у вас, вероятно, есть объект (или метод), который зависит от каталога, в котором должна быть выполнена работа. Таким образом, вы можете подтвердить эту зависимость от конструктора или метода. После этого, если вам нужно значение по умолчанию для этого каталога и значение по умолчанию исходит из системного свойства, вы можете просто создать фабричный метод или конструктор / метод с меньшим количеством параметров, передаваемых другому стоимостям / методу a:

new File(System.getProperty("java.io.tmpdir");

Вам не нужно создавать «магнит зависимости» только для того, чтобы он содержал параметр конфигурации.

4 голосов
/ 28 января 2009

если вы используете его в нескольких местах, было бы неплохо написать класс для инкапсуляции чтения свойства и, возможно, других свойств.

так что может быть что-то вроде: Configuration.getTeilitaryDirectory ()

3 голосов
/ 28 января 2009

Поскольку заголовок вопроса чрезвычайно широк, я добавлю еще одну полезную практику, которую следует учитывать при использовании системных свойств. Доступ к системным свойствам может быть запрещен SecurityManager, поэтому вам может потребоваться доступ к ним через PrivilegedAction, , например:

String tmpdir = AccessController.doPrivileged(new PrivilegedAction<String>() {
  public String run() {
    return System.getProperty("java.io.tmpdir");
  }
});

Используйте привилегированное действие, когда ваш код ограничивает чувствительное действие, чтобы оно было безопасным, даже если вредоносный код вызывает его.

Например, было бы небезопасно использовать привилегированное действие в методе, подобном OutputStream open(File file). Ненадежный код может вызывать его и использовать привилегии вашего кода для написания чего угодно и где угодно.

Однако, если бы у вас был метод, который сохранял пользовательские настройки вашего приложения в выбранном вами файле, это, вероятно, было бы безопасно. Злоумышленник не может выбрать местоположение файла или его содержимое; те указаны вашим кодом. Таким образом, ваш метод может использовать привилегированное действие, чтобы позволить его вызывать непривилегированным кодом.

1 голос
/ 28 января 2009

Я бы обработал их как любую другую константу, возможно, с префиксом P_ или PROP_, и поместил бы их в соответствующий класс констант.

Если вы используете их много, я бы даже подумал разбить их на класс PropertyNames констант:

public final class PropertyNames
{
  private PropertyNames()
  {
     // no instantiation
  }

  public static final String P_VAR_DIRECTORY = "org.acme.app.varDir";

  public static final String P_TMP_DIRECTORY = "java.io.tmpDir";
}

Наконец, я бы серьезно подумал о размещении имен самих имен свойств со стандартным обратным доменным именем, используемым для пакетов. Это просто во избежание столкновения со сторонними потребителями недвижимости.

0 голосов
/ 22 мая 2013

В Java строки являются неизменяемыми, что означает, что один и тот же объект в пространстве памяти не перезаписывается; новая строка создается каждый раз. В настоящее время наибольшее количество голосов предлагается использовать константу:

System.getProperty(Prop.TEMPDIR);

К сожалению, постоянная используется для фактического ключа свойства. Это означает, что каждый раз, когда вы делаете этот вызов, вы собираетесь создать новый объект String для хранения значения. На мой взгляд, вы должны сделать константу результатом самого звонка:

public static final String SYS_PROP_TEMP_DIR = System.getProperty("java.io.tmpdir");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...