gpt4 book ai didi

Java泛型。对我来说有什么好处?

转载 作者:行者123 更新时间:2023-11-29 06:04:30 26 4
gpt4 key购买 nike

此刻我开始开发基于 MVC 的小型 Web 应用程序。现在我尝试使用 DAO 模式实现模型布局的主要类。

所以,首先我创建两个实体类(例如):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

}

和书籍类:

  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()。所以,我为我的实体类创建接口(interface) 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);
}

下一步:创建接口(interface) AuthorDaoBookDao,扩展基础 dao interface Dao

但是两个接口(interface):AuthorDao 和 BookDao - 此时都是空的。你怎么看 - 在正常情况下,接口(interface)是空的?这是我的第二个问题。

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

现在我的主要问题是:

我的接口(interface) Dao 使用对象类型 Persistent 并且我不使用泛型。一切都很好。

你怎么看 - 如果我用泛型重新编写 Dao 接口(interface),我有什么好处:

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 类仅适用于持久实体 - 没有任何其他对象类型...

在我的情况下,你真的有任何理由使用泛型吗?

最佳答案

泛型可以极大地提高代码的可读性并减少可能由错误转换引起的错误。

我们正在使用与您描述的类似的东西(请注意,需要接口(interface)实现)。

这是一个基本示例(为简洁起见,我将省略 getter 和 setter):

@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);

关于Java泛型。对我来说有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8984320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com