Синглтон Java класс может иметь статическую константу? Ошибка сонара - PullRequest
0 голосов
/ 08 ноября 2018

В Java-синглтон-классе я хочу создать конечную константу, как показано ниже:

  1. private final int threshold = 3; // Пример несовместимого кода от Sonal lint
  2. private static final int THRESHOLD = 3; // Соответствующий код Sonarlint

У меня вопрос: почему в синглтон-классе должно быть ключевое слово static в константе final int / string, поскольку у этого класса только один экземпляр?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Это обычное объявление константы в Java.

private static final int THRESHOLD = 3;

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

Когда вы объявляете его как private final int THRESHOLD = 3;, это означает, что каждый экземпляру вашего класса будет его собственная копия поля THRESHOLD.Не имеет смысла объявлять его нестатичным, когда вы немедленно его инициализируете:

private final int THRESHOLD = 3;

Объявление нестатических полей final имеет смысл, когда вы инициализируете их в конструкторе.Таким образом, все экземпляры имеют одно и то же поле констант с разными значениями:

private final int threshold;

protected YourConstructor(int threshold){
    this.threshold = threshold;
}

Просто следуйте советам Сонарлинта и объявите его как static константу.

0 голосов
/ 08 ноября 2018

Sonarlint не уверен, что вы объявляете синглтон. Он пытается избежать гипотетических ошибок в будущем.

0 голосов
/ 08 ноября 2018

Это, вероятно, предупреждение, которое Сонар Линт не может распознать. Довольно сложно распознать синглтон со статическим анализом, поэтому они просто решили проигнорировать это предупреждение и в любом случае выдать предупреждение.

Хотя теоретически вы правы (есть только один случай, поэтому константа будет объявлена ​​только один раз), вам, возможно, будет лучше избавить будущих сопровождающих этого кода от путаницы (и необходимости настроить Sonar, чтобы игнорировать это предупреждение ), и просто определите его как static. Вы также можете получить незначительное улучшение потребления памяти, если компилятор на самом деле указывает на это, что AFAIK, он делает только с static final членами.

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