我有一个对数据库进行操作的类,但我想让它尽可能通用和抽象,因此通过对象返回类型。
这是该类的示例方法:
public static List<Object> getAll(String table) throws HibernateException{
Session sessie = HibernateUtil.getSessionFactory().openSession();
Transaction trans = sessie.beginTransaction();
List<Object> objects = sessie.createSQLQuery("SELECT * FROM " + table + ";").list();
trans.commit();
sessie.close();
return objects;
}
现在我还有另一个类User
其中应该有一个方法 getAll
与 List<User>
返回类型和方法的实现是相同的。
这可能吗?我知道不可能重载具有不同返回类型的方法。这是否可以通过某种设计模式、界面设置来实现?
所以基本上我不想再执行一次,它已经在 getAll
中指定了返回一个对象的方法。我只想执行该方法,但具有动态返回类型。
我问这个问题的原因是因为我不想在代码中的其他地方执行以下操作:
User user = new User(...);
// this should be user.getAll() and the type of that method should be an User, not an object
(User)user.getAll()
我这样做的原因是因为我将来可以有其他表可以调用 getAll
方法,但将转换对象作为返回类型而不是类型对象返回。
我正在寻找最干净、最好的面向对象解决方案,即使这意味着我需要重构我的代码。
最佳答案
如果您确实需要它,您可以使您的类成为泛型,并将返回类型作为泛型类型参数,这样您就可以:
public static List<T> getAll(String table)
然后执行
user = new YourGenericClass<User>();
List<User> list = user.getAll("user");
当您将表的名称作为参数传递时,这很丑陋。您可能应该重新考虑您的数据访问层设计。
编辑:
好吧,说得更清楚:
//Template generic class
public class GenericDAOAndModelClass<T> {
public static List<T> getAll(String table) { your code};
public static T getOne(String table) { your other code };
}
public class User extends GenericDAOAndModelClass<User> {
user methods and fields
}
然后你就可以这样调用它
List<User> userList = User.getAll("user");
User u = User.getOne("user");
您可以在每个扩展 GenericDAOAndModelClass 的类中放置一个静态字段来表示表名称,这样您就不必将参数传递给 getAll 和 getOne。
关于java - 带有类型转换/结构问题的 OO 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8196164/