Java Generics.Какая выгода в моем случае? - PullRequest
1 голос
/ 24 января 2012

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

Итак, сначала я создаю два класса сущностей (например): Автор и Книга:

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

        }

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

 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, и я не использую Generics. И все хорошо и красиво.

Что вы думаете - какие преимущества я получу, если переработаю 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);
}

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

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

Ответы [ 3 ]

2 голосов
/ 24 января 2012

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

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

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

@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);
1 голос
/ 24 января 2012

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

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

Теперь, когда вы расширите его, вам нужно будет создать сохранение, которое принимает только книгу:

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

Преимущество в том, что вы не можете передать Author на BookDao. Это не пройдет компиляцию.

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

0 голосов
/ 24 января 2012

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

ArrayList является универсальным, потому что иногда он возвращает Persistent, иногда президент.

...