私は現在、データベースからデータを取得し、次にUser
を作成する次のコードを持っています。このコードは、News
,Comments
などの他のオブジェクトを作成するために私のクラッセの多くで使用されています...Java汎用コンストラクタ
これはApacheのコモンズdbutilsを使用しています。ハンドラがResultSetでジェネリックT
をインスタンス化するよう
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
をラップし、クエリメソッドをオーバーライドすることが可能であろう。私はどのタイプの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;
}
};
}
}
あなたが理解してよかどうかは知りませんが、私はそう願って、あなたがより多くの詳細や、より良い説明をしたい場合は私に尋ねます。
EDIT
私は貴様のオブジェクトのすべてが伸びるだろうと代わりにジェネリック型のAbstractClassを使用することができると思ったが、私は抽象的なコンストラクタを書くことができないように思えます。私はJavaでこれを行うことが可能であるとは思わない
public abstract class DatabaseEntity {
public static abstract DatabaseEntity create(ResultSet rs);//even this doesn't work...
}
なぜ、コンストラクタに 'T type'を渡す必要がありますか? – yair
リフレクションを使用すると、結果セットを持つクラスコンストラクタを呼び出すことができます –