2012-01-24 2 views
1

В этот момент я начинаю работу над небольшим веб-приложением на основе MVC. Теперь я пытаюсь реализовать основные классы для макета модели с использованием шаблона DAO.Java Generics. Какая польза в моем случае?

Итак, в первую очередь создать два класса объектов (например): Автор и книга:

package myProject.model.entity; 

import java.io.Serializable; 

    public class Author implements Serializable { 

     private static final long serialVersionUID = 7177014660621405534L; 

     private long id; 
     private String firstName; 
     private String lastName; 

     public Author() {  
     } 
    // getter and setter methods here 

    } 

и книга класс:

package myProject.model.entity; 

    import java.io.Serializable; 

     public class Book implements Serializable { 

      private static final long serialVersionUID = 7177014660621405534L; 

      private long id; 
      private String title; 
      private String description; 

      public Book() {  
      } 
     // getter and setter methods here 

     } 

На следующем шаге, я вижу, что классы Книга и автор имеют getId() и setId(). так, я создаю интерфейс Persistent для моих классов сущностей:

package myProject.model.entity; 

     public interface Persistent { 

       public long getId(); 
       public void setId(long id); 


     } 

Итак, первый мой вопрос:

Это правильное применение для model пакета?

На следующем этапе я начинаю реализовывать классы для пакета dao.

package myProject.model.dao; 

import java.util.List; 

import myProject.model.entity.Persistent; 

public interface Dao { 

    Persistent get(long id); 

    void save(Persistent persistent); 

    void delete(long id); 
} 

Следующий шаг: создание интерфейсов AuthorDao и BookDao, которые расширяют базовый дао interface Dao

Но оба интерфейса: AuthorDao и BookDao - на данный момент пуст. Что вы думаете - это нормально, что интерфейсы пустые? Это мой второй вопрос.

И на последнем шаге я создаю пакет model.dao.hibernate и добавляю к пакету классу AuthorDaoHibernate и BookDaoHibernate - оба класса реализуют интерфейсы AuthorDao и BookDao.

И мой главный вопрос теперь:

мой интерфейс Dao работы с объектами типа Persistent и я не использую дженериков. И все хорошо и приятно.

Что вы думаете - какие преимущества у меня есть, если я переделываю Dao интерфейс остроумие Generics:

package myProject.model.dao; 

import java.util.List; 

import myProject.model.entity.Persistent; 

public interface Dao<Persistent> { 

    T get(long id); 

    List<T> getAll(); 

    void save(T persistent); 

    void delete(long id); 
} 

Моих Dao классы работают только с постоянными лицами - не какой-либо другой типа объекта ...

Есть ли у вас какие-либо причины во мне, если вы используете Generics?

ответ

2

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

Мы используем что-то похожее на то, что вы описали (обратите внимание, что существуют интерфейсы и).

Вот простой пример (я уеду методы получения и установки вне для brevitiy):

@MappedSuperClass 
class BaseEntity { 
    @Id 
    private int id; 
} 

@Entity 
class UserEnity extends BaseEntity { 
    //user stuff like name 
} 

class BaseDAO<T extends BaseEntity> { 
    public T findById(int id) { 
    ... 
    } 
    //other generic CRUD methods 
} 

@Stateless 
class UserDAO extends BaseDAO<UserEntity> { 
    //additional user specific methods 
} 

Использование UserDAO затем будет так:

UserDAO userDao; //some injection or lookup 

//no explicit cast needed here, thanks to generics 
UserEntity user = userDao.findById(userId); 

//compiler error due to the generic parameter being UserEntity and AnotherEntity doesn't extend that 
AnotherEntity a = userDao.findById(someId); 
+0

BaseEntity - должен быть абстрактным или нет? – user471011

+0

@ user471011 нет, он не должен быть абстрактным, это просто не аннотируется как сущность, и вы не можете сохранить простой экземпляр «BaseEntity». Было бы целесообразно сделать «BaseEntity» и даже «BaseDAO» абстрактным, но я оставил это для краткости. – Thomas

+0

мы можем обсудить об этом более подробно? по почте или через skype? Вам будет трудно? – user471011

0

Здесь нет причин. Если он уникален, он по определению не является общим. Список getAll() выполнит задание.

ArrayList является общим, потому что он иногда возвращает постоянный, когда-то президент.

1

Если вы хотите использовать дженерики вы должны определить Dao следующим образом:

public interface Dao<T extends Persistent> { 
    ..................... 
    void save(T persistent); 
    ................... 
} 

Теперь, когда вы расширяете его вам придется создать кроме того, что принимает книги только:

public class Book extends Dao<Book> { 
    ..................... 
    void save(Book persistent); 
    ................... 
} 

Выгода здесь что вы не можете пройти Author до BookDao. Это не приведет к компиляции.

BTW, если вы используете Hibernate, JPA или другое решение ORM, вам действительно не нужно создавать DAO для объекта. Один общий dao может решить все ваши потребности.

+1

На самом деле 'недействительным сохранить (стойкие книги); 'даже не понадобится, если реализация не будет отличаться от базовой. – Thomas

+1

@Thomas, я 100% согласен с вами. Я даже написал, что ему вообще не нужен DAO для сущности. Одна общая реализация достаточно хороша. – AlexR

 Смежные вопросы

  • Нет связанных вопросов^_^