Вопрос

Я работаю на Java над довольно большим проектом.Мой вопрос касается того, как наилучшим образом структурировать набор свойств для моего приложения.

Подход 1:Имейте некоторый объект со статическими свойствами, доступный каждому классу.(Недостатки:затем некоторые классы теряют свою общность, если их вырвать из контекста приложения;они также требуют явных вызовов некоторого статического объекта, который находится в другом классе и может в будущем исчезнуть;это просто не так чувствовать верно, или я ошибаюсь?)

Подход 2:Пусть свойства будут созданы основным классом и переданы другим классам приложений.(Недостатки:в конечном итоге вы передаете указатель на объект Properties почти каждому классу, и это, кажется, становится очень избыточным и громоздким;Я не знаю Нравится это.)

Есть какие-нибудь предложения?

Это было полезно?

Решение

Мне нравится использовать Spring-инъекцию для многих свойств. Вы можете рассматривать свое приложение как строительные блоки и вставлять свойства непосредственно в компонент, который нуждается в них. Это сохраняет (поощряет) инкапсуляцию. Затем вы собираете свои компоненты вместе и создаете «основной класс».

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

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

На самом деле, подход 2 работает очень хорошо.

Я пытался использовать объект свойств Singleton в недавнем проекте. Затем, когда пришло время добавлять функции, мне нужно было пересмотреть синглтон, и я пожалел, что нашел все места, где я использовал MySingleton.getInstance () .

Подход 2 к передаче глобального информационного объекта через ваши различные конструкторы легче контролировать.

Использование явного установщика также помогает.

class MyConfig extends Properties {...}

class SomeClass {
    MyConfig theConfig;
    public void setConfi( MyConfig c ) {
        theConfig= c;
    }
    ...
}

Это работает хорошо, и вы будете рады, что точно контролировали, какие классы действительно нуждаются в информации о конфигурации.

Если свойства нужны многим классам, я бы выбрал подход 1. Или, возможно, вариант, в котором вы используете шаблон проектирования Singleton вместо всех статических методов. Это означает, что вам не нужно постоянно передавать объект свойств. С другой стороны, если эти свойства нужны только нескольким классам, вы можете выбрать подход 2 по указанным вами причинам. Вы также можете спросить себя, насколько вероятно, что написанные вами классы будут на самом деле повторно использованы, и если это так, то насколько серьезной является проблема повторного использования объекта свойств. Если повторное использование маловероятно, не беспокойтесь об этом сейчас и выберите решение, которое является наиболее простым для текущей ситуации.

Похоже, вам нужен компонент configuration Manager.Это было бы найдено с помощью какого-то сервисного локатора, который мог бы быть таким же простым, как ConfigurationManagerClass.instance().Это заключило бы в себе все это веселье.Или вы могли бы использовать фреймворк внедрения зависимостей, такой как Spring.

Многое зависит от того, как компоненты находят друг друга в вашей архитектуре.Если другие ваши компоненты передаются в качестве ссылок, сделайте это.Просто будьте последовательны.

Если вы ищете что-то быстрое, вы можете использовать системные свойства, они доступны для всех классов. Вы можете сохранить значение String или, если вам нужно сохранить список «вещей», вы можете использовать метод System.Properties (). Это возвращает объект «Свойства», который является HashTable. Затем вы можете хранить все, что вы хотите в таблицу. Это не красиво, но это быстрый способ иметь глобальные свойства. YMMV

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

Внедрение зависимостей также является хорошим способом сделать это.

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

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

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

Подход 2 определенно лучше.

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

Посмотрите конфигурацию apache commons для получения справки по настройке Impl.

Так что в main () вы можете иметь

MyObject mobj = new MyObject();
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay);
mobj.setTrackerName(appConfig.getMyObjectTrackerName);

Вместо

MyObject mobj = new MyObject();
mobj.setConfig(appConfig);

где appConfig - это оболочка вокруг библиотеки конфигурации apache, которая выполняет весь поиск значений по имени значения в файле конфигурации.

Таким образом, ваш объект становится очень легко тестируемым.

Вы давно не работали с Java, но не могли бы вы просто поместить свои свойства в свойства java.lang.System? Таким образом, вы можете получить доступ к значениям из любой точки мира и избежать использования " глобального " класс недвижимости.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top