2

我有一个 DAOFactory,它返回给我一个特定的 dao

public class DAOFactory {

public static final int DAO1 = 1;
public static final int DAO2 = 2;

public static Object getDao(int dao) {
        switch (dao) {
            case DAO1:
                return new Dao1();
            case DAO2:
                return new Dao2();
        }
        return null;
    }
}

道是子

abstract class GenericDao<E, ID extends Serializable> implements
        GenericDaoInterface<E, ID>

所以它看起来像:

public class Dao1 extends GenericDao<Dao1, Integer>{
....
}

如果我创造新的道。我必须进行类型转换。

Dao1 dao = (Dao1) DAOFactory.getDao(DAOFactory.DAO1);

是否可以进行自动类型转换,或者最好在 DAOFactory 中创建方法来调用特定的 dao ?例如。public static Dao1 getDao1()

4

2 回答 2

3

创建一个接口 IGenericDao 并在 GenericDao 上实现它,工厂必须返回 IGenericDao 接口,通过这种方式,您可以使用所有 Dao 的泛型行为或在需要时强制转换为特定类型,使用 Class 而不是工厂参数的 int方法。

公共静态 IGenericDao getDao(Class)

只使用一种方法的另一个原因是,在未来的实现中,您可以使用反射来实现工厂并返回正确的类型,并且您不需要更改工厂的所有客户端。

于 2012-06-28T14:27:58.313 回答
1

您可以将“int”参数更改为“Class”参数,然后使用泛型返回该类的某些内容。
但这仅在有时您的代码不知道它将使用哪个 DAO 类时才有用,例如一些需要从工厂获取任意 DAO 子类型的通用代码。

如果您的代码非常具体,那么您可以创建您提到的那些特定方法。

恕我直言,人们对仿制药很感兴趣。
有时泛型代码看起来很糟糕,一两个类型转换很好,而且通常更可取。正如我所说,恕我直言。

于 2012-06-28T14:18:02.707 回答