SonarQube проблема с публичными статическими переменными |ДЖАВА - PullRequest
0 голосов
/ 12 октября 2018

У меня проблема с SonarQube при использовании переменных public static, проблема в том, что SonarQube хочет, чтобы это было public static final, эта переменная заполняется в других частях кода, она "динамически" (заполненас переменной среды), затем используется во всех других классах.

Это переменная arrayList

public static List<String> listPersons = new ArrayList<>();

Ошибки сонара:

1- Make this "public static listPersons" field final
2- Make listPersons a static final constant or non-public and provide accessors if needed
3- Make this member "protected"

Каков наилучший подход крешить эту проблему?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Технически, вы можете иметь (ссылку) на переменную final и все равно иметь ее содержимое , динамически заполняемое в более поздний момент:

public static final List<String> listPersons = new ArrayList<>();

//...

public void initialize() {
    List<String> contents = populateContentsFromEnvironmentVariable();
    listPersons.addAll(contents);
}

Однако, используя "константа mutable-content, такая как эта, вводит возможные проблемы.Например, вам нужно убедиться, что клиентский код не читает список до того, как он будет заполнен.Возможно, вы захотите пересмотреть свой дизайн так, чтобы специфические для среды свойства инициализировались только один раз и предпочтительно инкапсулировались так, чтобы к ним обращались через методы доступа вместо статических констант;это также позволило бы выполнять отложенную инициализацию, инициализацию по требованию, кэширование и т. д.

0 голосов
/ 12 октября 2018

Лучшим способом было бы инициализировать статический список следующим образом:

//Static final and unmodifiable list
private static final List<String> listPersons = createListPersons();


private static final createListPersons() {
      List<String> listPersonsTemp = getPersonsFromEnvironmentVariable();
      return Collections.unmodifiableList(listPersonsTemp);
}


public static final List<String> getListPersons(){
  return listPersons;
}

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

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

0 голосов
/ 12 октября 2018

Лучший подход - не создавать public static, но не final поля.Потому что это может привести к проблемам с разделением этих данных между потоками.

В вашем случае вы можете создать список static final и неизменный .

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