【发布时间】:2015-03-09 23:17:39
【问题描述】:
我最近开始使用 Java 开发一个新项目,该项目将有一个本地数据库。作为设计的一部分,我创建了一个 AbstractEntity 类 - 这旨在作为数据库中行(或潜在行)的对象表示。
虽然我在这个设计的早期遇到了一些问题,但我想确保我不会走上糟糕的道路。我遇到问题的一种特殊方法如下:
public ArrayList retrieveEntities(String sql)
{
ArrayList ret = new ArrayList();
String query = "SELECT " + getColumnsForSelectStatement() + " FROM " + getTableName() + " WHERE " + sql;
try (Connection conn = DatabaseUtil.createDatabaseConnection();
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery(query))
{
while (rs.next())
{
AbstractEntity entity = factoryFromResultSet(rs);
ret.add(entity);
}
}
catch (SQLException sqle)
{
Debug.logSqlException(query, sqle);
}
return ret;
}
这个方法背后的想法是有一个通用的方法从数据库中检索东西,我唯一需要传入的是 SQL 的条件。就目前而言,它可以正常工作,但我有两个问题:
1) 类型安全
我似乎无法在不导致编译器错误的情况下将此方法参数化。 ArrayList<AbstractEntity> 不好,我似乎也无法让 ArrayList<? extends AbstractEntity> 工作。当我尝试后者(这对我来说很有意义)时,以下行给了我一个编译器错误:
ArrayList<PlayerEntity> list = new PlayerEntity().retrieveEntities("1 = 1");
错误是“类型不匹配:无法从 ArrayList<capture#1-of ? extends AbstractEntity> 转换为 ArrayList<PlayerEntity>”
有没有办法可以直接从抽象类中引用超类?这个方法不是静态的,因为你不能实例化一个抽象类(它没有构造函数),要调用它我必须总是有一个扩展类。那为什么我不能引用它的类型呢?
2) 静态
理想情况下,我希望此方法是静态的。这样我就可以直接调用 PlayerEntity.retrieveEntities() ,而不是仅仅创建一个对象来调用它。但是,由于它指的是抽象方法,所以我不能这样做,所以我坚持使用它。
以上两种抱怨都在我脑海中敲响了警钟。有没有更好的设计方法来避免这些问题,或者有更好的直接解决方案来解决我遗漏的这些问题?
【问题讨论】:
-
旁注:你正在重新发明轮子 (en.wikipedia.org/wiki/Object-relational_mapping)
-
请参阅 stackoverflow.com/questions/2745265/… 了解为什么不能转换类。
标签: java generics static abstract