我正在创建测试,我必须创建列表以发送到测试对象。为了创建列表,我希望有一个名为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:努力不是那么大,但我想学习,因为它可能在将来有用。答案 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);