Mam obecnie następujący kod, który pobiera dane z bazy danych, a następnie utworzyć User
. Ten kod jest używany w wielu klassach do tworzenia innych obiektów, takich jak News
, Comments
itp ...Generic Javy Generic Konstruktorzy
Używa aputes 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);
byłoby możliwe, aby owinąć QueryRunner
w ogólnej klasy i zastąpić metodę obsługi zapytań tak instanciate generycznego T
z ResultSet. Upewniam się, że każdy typ T
będzie konstruktorem akceptującym ResultSet
.
tak:
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;
}
};
}
}
Nie wiem czy zrozumiesz, ale mam nadzieję, że tak, pytają mnie, jeśli chcesz poznać więcej szczegółów lub lepsze wyjaśnienie.
EDIT
Myślałem, że mogę użyć AbstractClass zamiast typu rodzajowego, że wszystkie obiekty zróżnicowanych by rozciąga ale wydaje się, że nie mogę napisać streszczenie konstruktora. Będę musiał dokonać statycznej metody, które zwracają instancję obiektu jak:
public abstract class DatabaseEntity {
public static abstract DatabaseEntity create(ResultSet rs);//even this doesn't work...
}
dlaczego musisz podać 'T type' w konstruktorze? – yair
użyj refleksji, możesz wywołać konstruktor klasy z zestawem wyników –