Java泛型。我的情况有什么好处?

时间:2012-01-24 09:15:32

标签: java model-view-controller generics interface dao

此时我开始研究基于MVC的小型Web应用程序。 现在我尝试使用DAO模式为Model布局实现主类。

所以,首先我创建了两个实体类(例如):Author和Book:

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

    }

和Book class:

  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()。 所以,我为我的Entity类创建了接口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

的接口BookDaointerface Dao

但是这两个界面:AuthorDao和BookDao--此时空无一人。 你觉得怎么样 - 通常,接口是空的?这是我的第二个问题。

在最后一步,我创建了包model.dao.hibernate并将包添加到类AuthorDaoHibernate和BookDaoHibernate中 - 这两个类都实现了AuthorDao和BookDao接口。

现在我的主要问题是:

我的界面Dao使用对象类型Persistent,我不使用泛型。一切都还不错。

你认为我有什么好处,如果我重新工作Dao界面机智:

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吗?

3 个答案:

答案 0 :(得分:2)

泛型可以极大地提高代码的可读性,并减少错误转换时可能产生的错误。

我们正在使用类似于您所描述的内容(请注意,需要接口实现)。

这是一个基本的例子(我将把getters和setter留给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);

答案 1 :(得分:1)

如果你想使用泛型,你应该将Dao定义如下:

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

现在,当你扩展它时,你将不得不创建只接受Book的保存:

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

此处的好处是您无法将Author传递给BookDao。这不会通过编译。

顺便说一句,如果您使用的是Hibernate,JPA或其他ORM解决方案,那么您实际上不必为每个实体创建DAO。一个通用dao可以解决您的所有需求。

答案 2 :(得分:0)

这里没有理由。如果它是独一无二的,根据定义,它不是通用的! 列表getAll()将执行作业。

ArrayList是Generic,因为它有时会返回Persistent,有时会返回总统。

相关问题