Attualmente ho il seguente codice che recupera i dati dal database e quindi crea un User
. Questo codice è usato in molti dei miei corsi per creare altri oggetti come News
, Comments
ecc ...java generici costruttori
Usa dbutils di apache comuni.
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);
sarebbe possibile avvolgere il QueryRunner
in una classe generica e sovrascrivere il metodo query in modo il gestore instanciate il generico T
con il ResultSet. Mi assicuravo che qualsiasi tipo di T
avesse un costruttore che accetta un ResultSet
.
Come così:
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;
}
};
}
}
Non so se capirai, ma spero di sì, mi chiede se volete maggiori dettagli o una spiegazione migliore.
EDIT
ho pensato che avrei potuto usare un AbstractClass invece che il tipo generico che tutti gli oggetti differenti avrebbero estende, ma sembra che non posso scrivere un costruttore astratto. Devo fare un metodo statico che restituisca un'istanza dell'oggetto come:
public abstract class DatabaseEntity {
public static abstract DatabaseEntity create(ResultSet rs);//even this doesn't work...
}
perché è necessario passare 'T type' nel costruttore? – yair
usa reflection puoi invocare il costruttore di classi con il set di risultati –