Запах кода sonarLint - присвоение значения статическому полю - PullRequest
0 голосов
/ 29 июня 2018

Вы можете изменить это, чтобы удовлетворить sonarLint? если я не выполняю присваивание, значение моей переменной будет нулевым ...

@SpringBootApplication
public class BwsApplication {
    private static ConfigClass config;

    public BwsApplication(ConfigClass configClass) {
        config = configClass;//SONAR - Remove this assignment of "config"
    }

    public static void main(String[] args) throws SQLException {
        SpringApplication.run(BwsApplication.class, args);
        Connection con = config.getConnection();
        int number = StudentsManager.getStudentsNumber(con);
        QuartzApp qa = new QuartzApp(config);
        qa.excecution(number );
    }
}

«Статические поля не должны обновляться в конструкторах» Мне нужно использовать переменную в статическом контексте!

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Класс помечен @SpringBootApplication.
И для справки ниже приведен конструктор, который вызывается Spring Boot при создании приложения bean:

public BwsApplication(ConfigClass configClass) {
    config = configClass;//SONAR - Remove this assignment of "config"
}

SpringBootApplication, представленный этим классом, будет создан один и только один раз. Таким образом, с логической точки зрения кажется недопустимым превращать это поле в поле static. Но на самом деле, сделать его static или нет не имеет значения, так как оно будет передано не более чем одному экземпляру. Вы ничего не жалеете, делая это static.
Я думаю, что вы создали поле static, потому что вы использовали бы его в методе static main.
Но это не способ сделать это.
Вместо этого удалите модификатор static и переместите этот код в метод экземпляра @PostConstruct, который будет выполнен после внедрения зависимости в этот компонент:

Connection con = config.getConnection();
int number = StudentsManager.getStudentsNumber(con);
QuartzApp qa = new QuartzApp(config);
qa.excecution(number );

Таким образом, вы можете ссылаться на поле config, даже если это поле экземпляра.

Это может выглядеть так:

@SpringBootApplication
public class BwsApplication {

    private  ConfigClass config;

    public BwsApplication(ConfigClass configClass) {
        config = configClass;//SONAR - Remove this assignment of "config"
    }

    public static void main(String[] args) throws SQLException {
        SpringApplication.run(BwsApplication.class, args);       
    }

    @PostConstruct
    private void postConstruct() {
      Connection con = config.getConnection();
      int number = StudentsManager.getStudentsNumber(con);
      QuartzApp qa = new QuartzApp(config);
      qa.excecution(number);
    }
}
0 голосов
/ 29 июня 2018

Этот код выглядит странно, и SonarLint правильно сообщает о запахе кода. Ваше поле config объявлено как static, т. Е. Оно совместно используется всеми экземплярами BwsApplication. Требование нового экземпляра ConfigClass при каждом вызове конструктора и переопределение полей static, скорее всего, не то, что вам нужно.

Вы можете исправить это, выполнив присваивание некоторым статическим методом, например ::

public class BwsApplication {
  private static ConfigClass config;
  ...
  public static final void init(final ConfigClass configClass) {
    config = configClass;
  }
}

Вашему конструктору больше не понадобится аргумент типа ConfigClass.


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


Просто чтобы исключить возможность: пожалуйста, убедитесь, что вы не перепутали static с final.

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