java - 带有类型转换/结构问题的 OO 设计

标签 java oop casting

我有一个对数据库进行操作的类,但我想让它尽可能通用和抽象,因此通过对象返回类型。

这是该类的示例方法:

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其中应该有一个方法 getAllList<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/

相关文章:

java - 使用java登录网站

c++ - 遗产。从父类调用子类函数

xcode - Swift:如何将协议(protocol)类型转换为特定协议(protocol)?

python - 在 Haskell 中以通用方式导航 JSON 对象

java - Spring + hibernate : Create database from DDL rather than using annotated model classes

java - faultString : java. lang.IllegalArgumentException: 参数类型不匹配

Java - 需要一些关于匹配 http 和 https 的正则表达式模式的帮助

c++ - 如何在不创建实例的情况下调用类方法

php - 为什么构造对象时不能使用它?

c - 无法理解在 inet_ntoa 函数中完成的类型转换