Предпочитаемый метод для инициализации параметров дочернего класса в Java? - PullRequest
1 голос
/ 28 августа 2009

У меня есть приложение, которое принимает некоторые входные данные и генерирует файлы конфигурации в качестве вывода. Поскольку точный формат ввода или вывода может со временем меняться, я определил два интерфейса: импортер и экспортер.

Каждый конкретный импортер или экспортер может иметь различные параметры, которые необходимо инициализировать для работы. Например, если данные для импорта поступают из CSV-файла, вам нужен только путь к файлу, но если данные поступают из базы данных, вам нужна строка подключения, имя пользователя, пароль и т. Д. То же самое для экспортеров.

Моя реализация в настоящее время:

public interface Importer {
    public void setup(Map<String,String> params);
    public List<ConfigEntry> getList();
}

public interface Exporter {
    public void setup(Map<String,String> params);
    public void writeDocument(List<ConfigEntry> entries) throws IOException;
}

Необходимо вызвать метод установки перед вызовом getList () или writeDocument (). Я использую карту для хранения параметров, потому что у каждого дочернего класса могут быть разные параметры.

Является ли использование инициализации параметров стиля JavaBean предпочтительным способом? Это означает, что добавление setConnnectionString (), setCSVFilePath (), setX () к каждому дочернему классу.

Каковы преимущества, недостатки этих подходов?

Ответы [ 2 ]

1 голос
/ 28 августа 2009

Существует два очевидных недостатка подхода на основе карты:

  1. Отсутствие четко определенных имен параметров. Да, вы могли бы где-то определить их как константы, но вам все равно нужно проверить, что имя параметра действительно как переданное.
  2. Отсутствие четко определенных типов параметров. Еще хуже, чем выше - если мне нужно передать целое число, мне придется преобразовать его в строку, и вам придется анализировать его (и иметь дело с возможными ошибками). Может быть несколько смягчен с помощью Map<String,Object> и автоматической привязки, но тогда вам все равно придется проверять соответствующие типы.

У подхода, основанного на установщике, есть только один недостаток - это невозможно сделать. То есть это не может быть надежно выполнено с помощью сеттеров ALONE - вам нужно дополнить его каким-нибудь методом init() или afterPropertiesSet(), который будет вызываться после всех сеттеров и позволит вам выполнить дополнительные (взаимозависимые) этапы проверки и инициализации.

Кроме того, что-то подобное практически напрашивается на некий Внедрение зависимостей . Например, Spring .

0 голосов
/ 28 августа 2009

Я бы не сказал, что передача объекта Map (или Properties) в конструктор обязательно предпочтительнее, чем установка, специфичная для дочернего класса, или наоборот. Какой подход лучше, зависит от того, как вы собираетесь создавать экземпляры классов.

Если вы собираетесь создавать экземпляры классов непосредственно из Java, тогда подход Map будет более аккуратным, особенно если у вас есть хороший способ собрать карты. (Например, загрузка объекта Properties из файла свойств.) Подход «сеттеры» заставляет вас писать код для каждого из API дочерних классов.

С другой стороны, если вы собираетесь создавать экземпляры классов с использованием некоторой контейнерной среды, которая поддерживает "разводку", "инверсию управления" или тому подобное (например, Spring, PicoContainer, JavaBeans и т. Д.), Тогда сеттеры обычно лучше , Фреймворк обычно заботится о том, когда и как создавать экземпляры классов и вызывать сеттеры, используя отражение для выполнения работы.

Так что ответ ... это зависит ...

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