Дизайн - Глобальные настройки из потребительского модуля - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь создать библиотеку. В моем коде были некоторые константы, которые представляли собой различные временные задержки и определенные значения String в коде. Я мог бы извлечь их в отдельный константный класс, чтобы получить что-то вроде

Delays.LENGTH_SHORT (кажется чище)

Они связаны со многими различными классами внутри кода библиотеки.

Теперь проблема заключается в том, чтобы сделать его настраиваемым от вызывающего потребителя (т. Е. Если потребитель предоставляет значения, затем используйте их, в противном случае используйте предустановленные значения). С потребительской стороны я решил использовать шаблон Builder для создания конфигурации и передачи ее в init модуля библиотеки (это случается только один раз в жизненном цикле).

Есть ли способ сохранить вышеуказанный синтаксис и при этом принять конфигурацию от потребителя (настройки настраиваются только один раз в течение init, в остальное время он полностью ведет себя как постоянный)?

Чтение из файла оказалось дорогостоящим.

1 Ответ

0 голосов
/ 27 октября 2018

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

public interface Configuration {
    public Continent getContinent(); //For fixed set of values use enum
    public Integer getPoolSize(); //If the config can take any value then use the corresponding data type directly
    public String getDefaultLabel();
}

public enum Continent {
    ANTARTICA, AFRICA, ASIA, AUSTRALIA, EUROPE, NORTH_AMERICA, SOUTH_AMERICA;
}

public class ConfigurationBuilder {

    private DefaultConfiguration configurationInstance;

    private class DefaultConfiguration implements Configuration {

        //Ideally the below values should be read from a property file, instead of hard coding it here.
        private Integer poolSize = Integer.valueOf(50);
        private String defaultLabel = "DEFAULT";
        private Continent continent = Continent.ASIA;

        @Override
        public Continent getContinent() {
            return continent;
        }

        @Override
        public Integer getPoolSize() {
            return poolSize;
        }

        @Override
        public String getDefaultLabel() {
            return defaultLabel;
        }
    }

    public ConfigurationBuilder withContinent(Continent continent) {
        this.configurationInstance.continent = continent;
        return this;
    }

    public ConfigurationBuilder withPoolSize(Integer poolSize) {
        this.configurationInstance.poolSize = poolSize;
        return this;
    }

    public ConfigurationBuilder withDefaultLabel(String defaultLabel) {
        this.configurationInstance.defaultLabel = defaultLabel;
        return this;
    }

    public Configuration build() {
        return this.configurationInstance;
    }

    public ConfigurationBuilder() {
        this.configurationInstance = new DefaultConfiguration();
    }

    public static Configuration buildDefaultConfiguration() {
        return new ConfigurationBuilder().build();
    }
}

public class Library {
    private Configuration configuration;
    public void init(Configuration configuration) {
        this.configuration = configuration;
    }
    public void init() {
        this.configuration = ConfigurationBuilder.buildDefaultConfiguration();
    }
    private Library(Configuration config) {
        this.init(config);
    }
    private Library() {
        this.init();
    }

    /**
     * Library is not singleton here.
     * 
     */
    public static Library getInstance(Configuration configuration) {
        return new Library(configuration);
    }
    public static Library getInstance() {
        return new Library();
    }
}

public class Client {
    public static void main(String args[]) {
        Configuration config = new ConfigurationBuilder()
                .withContinent(Continent.AFRICA)
                .withPoolSize(20)
                .withDefaultLabel("Label")
                .build();
        Library lib = Library.getInstance();
        lib.init(config);
    }
}

Пожалуйста, проверьте классы Library и Client для использования.- Он использует шаблон Builder.- Он имеет методы init () и init (Configuration), чтобы полностью полагаться на значения по умолчанию библиотеки.- ConfigurationBuilder поддерживает предоставление некоторых или всех значений конфигурации для переопределения. - В настоящее время все три параметра конфигурации могут быть переопределены - continent, poolSize и defaultLabel.Однако, если какая-то конфигурация является частной для библиотеки, просто удалите метод withXXX для этого свойства из Builder.

Надеюсь, что это соответствует вашим потребностям.Хороший вопрос!

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