Внедрение зависимостей и статические методы - PullRequest
0 голосов
/ 19 сентября 2018

Мне было интересно, как заставить статический метод работать с внедрением зависимостей.
Например:

public class Util {
    Main main;

    public Util(Main main) { this.main = main }

    public static void showMessage() {
        System.out.println("message = " + main.messageMethod());
    }
} 

Это то, что я хочу сделать, но если я делаю это таким образом, когдаЯ вызываю метод из другого класса, например Util.showMessage();, он говорит мне, что main равен нулю.
Я смотрю, как заставить эту работу работать правильно, так как это будет немного раздражать DI для каждого статического метода в этом классе.

1 Ответ

0 голосов
/ 19 сентября 2018

Вам необходимо передать Main в статический метод:

public static void showMessage(final Main main) {
    System.out.println("message = " + main.messageMethod());
}

Рекомендации по написанию служебных классов:

  1. Утилиты / методы должны быть без состояний.Утилиты не должны иметь членов.Служебные методы должны принимать все необходимые переменные в качестве параметров.Служебные классы могут вызываться из нескольких потоков в параллельной среде.Изменяемые переменные-члены делают классы не ориентированными на многопотоковое исполнение и вызывают неприятные ошибки в параллельной среде
  2. Методы утилит не должны создаваться и не вводиться. У них должен быть закрытый конструктор.
  3. Классы утилит должны бытьfinal (не расширяемый).

После применения этих правил к вашему служебному классу он будет выглядеть следующим образом:

public final class Util {

    private Util();

    public static void showMessage(final Main main) {
        System.out.println("message = " + main.messageMethod());
    }
}

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

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