有没有办法创建一个由参数传递的类的新实例的方法?

时间:2015-06-19 10:04:01

标签: java

我正在创建测试,我必须创建列表以发送到测试对象。为了创建列表,我希望有一个名为createEntitiesList的方法,其中我发送列表中的元素数量并接收填充了元素的列表(具有有效但随机生成的值)。 这是非常基本的,但我希望能够创建不同类型的列表,例如

List<Professor> list = createEntityList(Professor.class);
List<Student> list = createEntityList(Student.class);

当然,教授和学生有不同的属性我想填写。

我目前的方法就是这个:

    private <T> List<T> getEntityList(Class<T> entityType, int numberOfItems) {
        List<T> entities = new ArrayList<T>();

        for (int i = 0; i < numberOfItems; i++) {
            if (entityType.equals(ProfessorEntity.class)) {
                entities.add((T) createProfessorEntity(i));
            } else {
                throw new UnsupportedOperationException("Not yet implemented");
            }

        }

        return entities;
    }

    @SuppressWarnings("unchecked")
    private <T> T createProfessorEntity(int index) {
        ProfessorEntity entity = new ProfessorEntity();
        entity.setTitle(String.format("Title %s", index));
        entity.setNamecompany);
        return (T) entity;
    }

好吧,它有效,但我觉得我没有真正实现我的目标,因为我必须为我想要创建的每个新类型类创建一个新方法和一个“if”语句。 另一方面,我认为我所做的任何改进都不需要付出更少的努力。

有什么方法可以改进这段代码,只能调用一个方法来创建所需类型的实体,但减少添加新支持类的工作量?

ps:努力不是那么大,但我想学习,因为它可能在将来有用。

2 个答案:

答案 0 :(得分:3)

这是你可以做的:

但请记住将默认构造函数添加到要实例化的所有类中。此解决方案使用反射API并调用这些类的默认构造函数来实例化它们。

getActivity().unregisterReceiver(smsBroadcastReceiver);

如果您可以控制要以这种方式实例化的类,那么您可以做的一件事就是使用所有这些类继承的超类或接口。这样,您可以为方法添加类型安全性:

private <T> List<T> getEntityList(Class<T> entityType, int numberOfItems) throws Exception {
    List<T> entities = new ArrayList<T>();

    for (int i = 0; i < numberOfItems; i++) {
        Constructor<T> ctor = entityType.getConstructor();
        entities.add(ctor.newInstance());
    }

    return entities;
}

这可以帮助您摆脱抛出的异常,这只允许实例化受支持的类。

是的,记得要正确处理异常。

答案 1 :(得分:2)

是的,你可以。首先定义一个接口:

public interface EntityCreator<T> {
    T create(int index);
}

然后将此接口的实例传递给您的方法:

private <T> List<T> getEntityList(EntityCreator<T> creator, int numberOfItems) {
    List<T> entities = new ArrayList<T>();

    for (int i = 0; i < numberOfItems; i++) {
        entities.add(creator.create(i));
    }

    return entities;
}

然后,创建10个教授实体:

List<ProfessorEntity> list = getEntityList(this::createProfessorEntity, 10);

如果你还没有使用Java 8,你将不得不使用内部类:

List<ProfessorEntity> list = getEntityList(new EntityCreator<ProfessorEntity>() {
    @Override
    public ProfessorEntity create(int index) {
        return createProfessorEntity(i);
    }
}, 10);