instanceof против isAnX () - PullRequest
       22

instanceof против isAnX ()

1 голос
/ 19 мая 2011

В Java я пишу некоторые объекты DTO, которые все наследуются от AllocationDTO.
Список этих объектов затем передается в объект DAO для сохранения в базе данных.

В зависимости от того, какойподтип AllocationDTO сохраняется при сохранении изменений в логике сохранения (например, какую таблицу в базе данных сохранить в и т. д.)

Я использую такой код:

for (AllocationDTO x : listOfAllocationDtos) {
    if (x instanceof ManagerAllocationDTO) {
         Manager m = (x(ManagerAllocationDTO)).getManager();
         // save manager etc to managerallocs
    } else if (x.getId() == AllocationDTO.TYPE_SPECIAL1) {
         // save to specialAlloc1 table
    } else if (x.getId() == AllocationDTO.TYPE_SPECIAL2) {
         // save to specialAlloc2 table
    }
}

The *У 1011 * есть дополнительное поле, связывающее распределение с менеджером, но для случаев specialalloc1 / 2 я не сделал подтип, потому что единственное различие в данных - это таблица, в которой они сохранены.

Мой вопроснемного мягкий вопрос дизайна - это лучший способ сделать это?

1 Ответ

1 голос
/ 19 мая 2011

Один из способов разделения разных экземпляров без instanceOf и if-else-cascade - это использование шаблона Visitor Design .

  • new Интерфейс: AllocationVisitorс одним методом для каждого конкретного подкласса AllocationDTO:

    • посещение (TYPE_SPCIAL1 dto)
    • посещение (TYPE_SPCIAL2 dto)
  • AllocationDTO: абстрактный void acceptVisitor (посетитель AllocationVisitor)

  • Каждый конкретный подкласс AllocationDTO реализует acceptVisitor () следующим образом: void acceptVisitor(AllocationVisitor visitor){visit(this);} // правильный тип посещения выбирается типом времени компиляции.
  • Ваш DTO реализует интерфейс AllocationVisitor (с внутренним классом), создает его экземпляр и передает его элементам listOfAllocationDtos.

DAO:

AllocationVisitor saveVisitor = new AllocationVisitor() {
  visit(TYPE_SPCIAL1 dto) {//what ever you need}
  visit(TYPE_SPCIAL2 dto) {//what ever TYPE_SPCIAL2 needs}
}
for (AllocationDTO x : listOfAllocationDtos) {
  x.visit(saveVisitor);
}
...