Java: обязательный конструктор сонара

Мы используем Sonar для анализа кода. Для занятий примерно так

public class Car {
  private Engine engine; 

  // getter setter for engine
}

мы получаем такие ошибки, как

Non-abstract classes and enums with non-static, private members should explicitly initialize those members, either in a constructor or with a default value.

Обычно мы сериализуем наши объекты с помощью Jackson, поэтому конструктор нигде в нашем коде не используется. Так зачем мне еще писать конструктор? Есть ли смысл отключить это правило? Ссылка на правило

Другое дело, если я изменю код, как показано ниже

private Engine engine = null;

Ошибка не выкидывается. По умолчанию всем ссылкам Java присваивается нулевое значение. Эта линия обманывает Сонар? Это должно быть ошибкой в ​​Sonar?

Обратите внимание, что он рекомендует "явно инициализировать", поэтому неявная инициализация нулевым значением не будет учитываться.

jonrsharpe 04.05.2018 20:38

Это проблема исходного сигнала разработчика: «Это то, что я намереваюсь» (т.е. null) против «Я забыл или не позаботился установить начальное значение».

Jim Garrison 04.05.2018 20:39

Если класс Только используется Джексоном / другой библиотекой посредством отражения, то вы можете добавить //NOSONAR или использовать механизм аннотации @SuppressWarnings для кода нарушения с комментарием, в котором упоминается Зачем, вы игнорируете правило. Это покажет другим, что переменные экземпляра не инициализированы явно по дизайну.

Mick Mnemonic 04.05.2018 20:49

Отключение правила немного опасно, потому что другие файлы с проблемой (подлинные) также могут быть проигнорированы. Вместо этого используйте NOSONAR или исключите класс / пакет. Вы также можете отметить нарушения как ложно положительный.

Vasan 04.05.2018 21:10

@jonrsharpe @Jim Garrison Вы правы, явное присвоение нулевых значений имеет смысл. @Mick Mnemonic //NOSONR или @SuppressWarnings не имеет смысла. Он также проигнорирует другие ошибки. @Vasan, верно, отключение правила опасно.

Ganesh Satpute 05.05.2018 10:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
2 115
1

Ответы 1

У Sonar очень категоричные представления о том, что вам следует делать, чтобы избежать дефектов. Здесь, по их мнению, вы должны четко указывать на инициализацию полей экземпляра. Я предполагаю, что они думают, что добавление «= null» показывает, что вы хотели установить для поля значение null, и что это не является недосмотром.

Добавление большого количества // NOSONAR в код, совместно используемый многими разработчиками, является плохой практикой, поскольку вскоре это становится условностью и сводит на нет цель использования Sonar. Я предлагаю просто отправить в Sonar и добавить инициализацию. Либо так, либо отключи правило.

Другие вопросы по теме