Дизайн Java-классов и SAX-парсер - PullRequest
0 голосов
/ 02 марта 2012

Отказ от ответственности .... Я новичок в Java и ООП.

У меня есть суперкласс с четырьмя подклассами. Для каждого подкласса мне нужно проанализировать файл XML. Около 40% -50% элементов в каждом XML идентичны друг другу, а другая половина отличается для каждого подкласса.

Мой первоначальный подход состоял в том, чтобы включить код обработчика синтаксического анализатора SAX в суперкласс и просто перечислить в нем все возможные элементы XML. Но затем я столкнулся с проблемой передачи остальных 50% -60% элементов, специфичных для подклассов, обратно подклассам. Поскольку суперкласс не знает о каждом подклассе (я думаю), я думаю, что нарушил бы принципы ООП, если бы каким-то образом принудительно передавал эти данные подклассам.

Так что теперь я думаю, что мне может понадобиться настроить четыре разных SAX-парсера, по одному в каждом подклассе. Суперкласс по-прежнему будет использоваться для общих переменных экземпляра и других методов. Но у меня также была бы четверная копия некоторого кода парсера SAX.

Какой-нибудь совет о том, как действовать и оставаться верным принципам ООП?

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Для этого уровня сложности я бы рекомендовал альтернативный подход к отображению XML на уровень вашего объекта.Посмотрите JAXB - он обеспечивает очень надежную среду для такого рода сопоставлений и автоматически обрабатывает наследование объектов.

0 голосов
/ 02 марта 2012

Насколько я понимаю, у вас есть 4 SAXParser с (или они DefaultHandlers? Независимо от того ...), которые имеют общего родителя.

Родитель должен иметь возможность сохранять состояние, которое является«поделился» между 4 детьми.В терминах наследования дети могут точно знать, какими методами и свойствами обладают их родители.Фактически, они являются родом .Им нужно знать, что они унаследовали, поэтому вы должны import A, если определяете B extends A.То, что нарушает принципы ООП, - это когда объект имеет ссылку на свой контейнер в отношении агрегации - это наоборот.

Итак, определите общие процедуры обработчика обратного вызова в родительском и переопределите обработчики в дочерних элементах, которые должны обрабатыватьдополнительные теги.Просто убедитесь, что вы звоните super(), и рассмотрите возможность сделать ваше общее состояние protected.

...