泛型类的多个实例

时间:2012-09-19 14:47:01

标签: java generics instantiation

我正在尝试创建一个通用的DAO,以避免在许多单独的DAO中使用或多或少相同的代码。

我的问题是在以下代码行中:

private BaseDAOImpl<Artist> baseDAOArtist = new BaseDAOImpl<>(Artist.class);
private BaseDAOImpl<ArtistRelation> baseDAOArtistRelation = new BaseDAOImpl<>(ArtistRelation.class);

第一个似乎被跳过了。

BaseDAOImpl的摘录:

public class BaseDAOImpl<T> implements BaseDAO<T> {

    private Class<T> entity;
    private DAOFactory daoFactory = Config.getInstance().getDAOFactory();
    private static String SQL_FIND_BY_ID;

    public BaseDAOImpl(Class entity) {
        this.entity = entity;
        SQL_FIND_BY_ID = "SELECT * FROM VIEW_" + entity.getSimpleName() + " WHERE id = ?";        
    }
}

是不可能以这种方式实例化多个对象?

2 个答案:

答案 0 :(得分:1)

是。目前还不清楚你的意思是“第一个似乎被跳过了。”但可能是你使用“SQL_FIND_BY_ID”的静态值?截至目前:

private BaseDAOImpl<Artist> baseDAOArtist = new BaseDAOImpl<>(Artist.class);

创建两个实例变量,然后设置SQL_FIND_BY_ID的值:

private BaseDAOImpl<ArtistRelation> baseDAOArtistRelation = new BaseDAOImpl<>(ArtistRelation.class);

创建两个新的实例变量,并为两个实例更改值“SQL_FIND_BY_ID”。

答案 1 :(得分:0)

如果没有更详细的错误描述我现在或多或少猜测,但从变量名称和代码片段判断我会怀疑 static 字段SQL_FIND_BY_ID是原因。

当您实例化两个DAO时,构造函数BaseDAOImpl的第二次执行将覆盖静态字段的值。如果DAO依赖于存储在那里的SQL查询,它将始终查询最后一个实例化DAO的实体。

静态字段和方法在类的所有实例之间共享,即使它们的泛型参数不同。与例如在C ++的模板中,没有为每个泛型参数生成单独的类。

要为每个实体实现单独查询的所需行为,您可以将静态字段更改为非静态成员。