gpt4 book ai didi

Java泛型构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:42:17 26 4
gpt4 key购买 nike

我目前有以下代码从数据库中检索数据,然后创建一个 User。此代码在我的许多类中用于创建其他对象,例如 NewsComments 等...

它使用 apache commons dbutils。

final ResultSetHandler<User> handler = new ResultSetHandler<User>() {

@Override
public User handle(ResultSet rs) throws SQLException {

User user = null;
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
return user;
}
};

final User user = run.query(
"SELECT id, username, password FROM users WHERE username = ? AND active = 2 LIMIT 1;", handler,
username);

是否可以将 QueryRunner 包装在通用类中并覆盖查询方法,以便处理程序使用 ResultSet 实例化通用 T。我会确保任何 T 类型都会有一个接受 ResultSet 的构造函数。

像这样:

        public class QueryExecuter<T> extends QueryRunner {
private ResultSetHandler<T> _handler;

public QueryExecuter(){//The T type was for testing haha
super();
handler = new ResultSetHandler<T>() {

@Override
public T handle(ResultSet rs) throws SQLException {

T object = null;
if (rs.next()) {
object = new T(rs);
}
return object;
}
};
}
}

我不知道你是否能理解,但我希望能理解,如果你想要更多细节或更好的解释,请问我。

编辑

我以为我可以使用 AbstractClass 而不是所有不同对象都将扩展的通用类型,但似乎我无法编写抽象构造函数。我是否必须创建一个返回对象实例的静态方法,例如:

public abstract class DatabaseEntity {
public static abstract DatabaseEntity create(ResultSet rs);//even this doesn't work...
}

最佳答案

可能吧?但这是个坏主意。

你可以这样做:

class ResultSetHandler<T> {
ResultSetHandler<T>(Class<T> clazz) {
this.clazz = clazz;
}

public T handle(ResultSet rs) throws SQLException {
T object = null;
if (rs.next()) {
object = clazz.getConstructor(ResultSet.class).newInstance(rs)
}
return object;
}
}

然而,混合域和数据库并不是一个好主意。然而,更好的方法是定义一个基于结果集创建对象的抽象方法:

abstract class ResultSetHandler<T> {

protected abstract T create(ResultSet rs);

public T handle(ResultSet rs) throws SQLException {
T object = null;
if (rs.next()) {
object = create(rs);
}
return object;
}
}

然后,在你的实现类中,你只需要提供一个create()方法,而不需要自己处理结果集,例如:

h = new ResultSetHandler<Person>() {
protected Person create(ResultSet rs) {
return new Person(rs.getString("name"));
}
}

关于Java泛型构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9183288/

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