Инкапсуляция общих методов базы данных в суперклассе Java и последующий вызов из дочерних классов не работает без приведения.ПОМОГИТЕ - PullRequest
1 голос
/ 27 июля 2010

У меня куча проблем с Java из PHP-фона.У меня есть родительский класс Entity, содержащий общие методы базы данных, такие как статический метод getById(int id).Моя цель - иметь детей этого класса, таких как Person, чтобы я мог позвонить:

Person p = Person.getById(1);

В данный момент это не работает, так как getById(1) возвращает EntityPerson.Я мог бы привести результат, но должен быть лучший способ, чем выполнять приведение каждый раз, когда вы вызываете один из универсальных методов?

В PHP моя последняя строка была бы примерно такой:

return new static(..);

Насколько я могу судить, я не могу сделать это на Java из-за отсутствия усовершенствованных обобщений?

Буду признателен за любую помощь.Если это невозможно, я с радостью приму предложения относительно лучшего подхода

Ответы [ 2 ]

0 голосов
/ 27 июля 2010

Вам нужно написать статический метод getById для класса Person, который возвращает Person. Могу ли я предположить, что в getById вы планировали использовать отражение для установки всех переменных-членов и требовать, чтобы они были такими же, как столбцы в базе данных? Или вы планируете использовать HashMap и хранить там значения столбцов?

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

0 голосов
/ 27 июля 2010

Вы хотите следовать шаблону DAO. Разработайте интерфейс PersonDao с методами сохранения, загрузки, обновления и т. Д. .... предоставьте реализацию. Постоянные операции должны выполняться в DAO, а не в классах домена - они предоставляют бизнес-логику (например, дают полное имя Perso на основе first и last, например).

Если вы действительно амбициозны, вы можете определить общий DAO, и ваши реализации должны быть действительно простыми, потому что все функциональные возможности определены в общем. Google вокруг этого ...

изменить - я сделал это для вас

http://www.ibm.com/developerworks/java/library/j-genericdao.html

...