Лучший шаблон проектирования для передачи необходимой переменной всему коду без - PullRequest
0 голосов
/ 25 марта 2020

По сути, у меня есть логическое значение, которое используется примерно 20% всех моих классов в большом проекте API. Все, от служебных методов до больших классов, использует это. Я могу установить состояние (которое не изменится) при запуске программы, но я не знаю «лучший» способ доступа к нему.

Изначально я пошел на внедрение зависимостей. Быстро, число параметров метода выросло, так как почти все это нужно. Было больно наблюдать за одним логическим значением почти по всем параметрам в определенных классах. Я решил попробовать метод stati c. Я придумал следующую структуру классов:

public final class MyClass {
    private static boolean neededBoolean;

    public MyClass(boolean bool) {
        MyClass.setBoolean(bool);
    }

    private static void setGems(boolean bool) {
        MyClass.neededBoolean = bool;
    }

    public static boolean getNeededBoolean() {
        return neededBoolean;
    }
}

Это казалось странным, но большинство методов stati c обычно не читают внутренние переменные, и любая программа могла легко (целенаправленно или нет) изменить переменную для всего. Я понял, что мог бы также использовать синглтон, но мне сказали, что они лучше всего подходят для логгеров и других целей, а не для чтения переменных * stati c. Я также не хочу делать логическое значение publi c, чтобы любые другие классы могли его редактировать.

Так какой же лучший выбор здесь? Злоупотребление внедрением зависимостей, синглтоном или моей текущей системой

1 Ответ

1 голос
/ 25 марта 2020

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

Например, если вы используете Spring Framework, вы можете внедрить его следующим образом, поэтому значение инициализируется, например, из application.properties file:

@Component
class MyComponent {
    @Value("${needed.boolean}")
    private boolean neededBoolean;

    // code here that can use the value
}

Однако вы можете рассмотреть возможность использования объекта конфигурации свойства, чтобы имя свойства не копировалось по всему вашему коду. Более надежный в этом отношении.


Если у вас нет структуры зависимостей и вы согласны с вызовом метода stati c (тесная связь), и значение инициализируется только при запуске, Я бы предложил такой класс:

public final class AppConfig {
    private static Boolean neededBoolean;

    public void static initialize(boolean neededBoolean) {
        if (neededBoolean != null)
            throw new IllegalStateException("Already initialized");
        AppConfig.neededBoolean = neededBoolean;
    }

    public static boolean getNeededBoolean() {
        if (neededBoolean == null)
            throw new IllegalStateException("Not initialized");
        return neededBoolean;
    }
}
...