sonarlint заставляет объявить константу конечного класса защищенной - PullRequest
0 голосов
/ 07 июня 2019

У меня есть последний класс с приватным конструктором:

public final class Constants {
   public static final Date DEFAULT_DATE;

   static {
    // some code that creates localDate
    DEFAULT_DATE = localDate.toDate();
   }

   private Constants() {
   }
}

sonarlint выдает предупреждение:

 Make DEFAULT_DATE protected
 reason: Mutable fields should not be "public static"

Объявление о защите не имеет смысла. Класс объявлен как final - поэтому наследование невозможно. Во-вторых, я использую DEFAULT_DATE в других классах, поэтому он должен быть публичным.

Кроме того, конструктор объявлен как закрытый, поэтому объект не может быть создан.

Почему sonarlint заставляет защищать DEFAULT_DATE?

Ответы [ 3 ]

1 голос
/ 07 июня 2019

Я уже упоминал в своих комментариях. Я повторяю пункты и добавляю несколько новых пунктов ниже всесторонним образом.

  1. Наличие общедоступной ссылки на тип Date, обработка и принятие ее как константы (путем объявления ее конечными статическими ключевыми словами) - это дизайн BAD, поскольку он не является константой (Date является изменяемой).
  2. Использование ключевого слова final предотвращает повторное назначение, т. Е. Вы не можете снова использовать = оператор назначения. Но ключевое слово final не мешает ., точечный оператор. Используя оператор точки, можно изменить состояние объекта даты. Constants.DEFAULT_DATE.setTime(204587433443L) Изменит вашу предполагаемую постоянную дату.
  3. Решение 1 : Вы можете сделать DEFAULT_DATE закрытым и создать метод получения, а когда он вызывается, вы можете создать новый объект Date, скопировать состояние DEFAULT_DATE и вернуть его. Таким образом, даже если какая-либо модификация будет выполнена, она будет на скопированном объекте, а исходный объект останется без изменений Для следующего чтения будет возвращена свежая копия оригинального объекта.
  4. Лучшее решение 2 : сохранить длинное значение Date как константу. Пусть вызывающий код создает объект даты, используя постоянное значение long. (Вы также можете добавить служебный метод где-нибудь в своем коде, может быть служебным классом, если у вас есть место, где вы можете использовать в качестве входного параметра длину и возвращать объект даты после создания объекта даты, соответствующего значению входного значения long.)

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

1 голос
/ 07 июня 2019

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

0 голосов
/ 11 июня 2019

Отвечая на мой собственный вопрос:

Как объяснили другие, java.util.Date является изменяемым, поэтому плохой дизайн - предоставлять его как константу, поскольку на самом деле это не так.

@ nits.kk дал лучшее решение «Сохранить длинное значение Date как константу» и использовать пусть вызывающая сторона преобразует длинное значение в объект Date.

public static final long DEFAULT_DATE = <long value representing the required date>;

Просто улучшение этого и того, как яиспользование сейчас в моем коде означает использование java.time.Instant, который является неизменным объектом

public static final Instant DEFAULT_DATE = Instant.parse("<ISO-formatted-date>");

Таким образом, я сохраняю предполагаемый объект Date, и больше не будет предупреждений / ошибок от статической проверки.

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