OO设计与铸造/结构问题

时间:2011-11-19 18:17:46

标签: java oop casting

我有一个对数据库进行操作的类,但是我希望尽可能保持它的通用性和抽象性,因此通过Object返回类型。

以下是该类的示例方法:

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方法但是将一个强制转换对象作为返回类型而不是类型对象。< / p>

我正在寻找最干净,最好的OO解决方案,即使这意味着我需要重构我的代码。

3 个答案:

答案 0 :(得分:1)

如果你确实需要它,你可以使用返回类型作为泛型类型参数使你的类具有通用性,这样你就可以:

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。

答案 1 :(得分:1)

实现不同接口IMO的对象集合与合理的设计背道而驰。完全通用的实现将强制您使用instanceof等重新实现伪OOP功能。

底层DAO可以模仿以减少样板。

例如,Hibernate DAOs are very often genericized。他们返回的类型是特定于类型的功能所在的位置。

答案 2 :(得分:0)

如果我是你,我会为我的应用中的每个实体创建一个DAO。我认为这是一种更清洁,更好的设计。