我有一些辅助类用于测试,具有以下结构:
public class EntitiesForTest {
public static Entity firstEntity() {
return new Entity(/*some dummy data*/)
}
public static Entity secondEntity() {...}
...
public static Entity nthEntity() {...}
public static List<Entity> allEntities() {???}
}
这个类的目的是让一些对象来测试我系统的上层,比如有一些JSON数据来测试REST服务。这种技术不是我的,而是来自我正在进行的在线课程,非常酷。
我想知道是否有办法根据类的静态继承方法和集合框架构建List<Entity>
。我可以做Arrays.asList(/*call the methods one by one comma-separated*/)
,但必须有一个更聪明,功能和可重复使用的方法。
提前感谢您的回答。
答案 0 :(得分:1)
&#34;现代&#34;方式
public static List<Entity> getEntities() {
return Arrays.stream(Foo.class.getMethods()).
filter(method -> method.getReturnType() == Entity.class &&
Modifier.isStatic(method.getModifiers())).
map(method -> {
try {
return (Entity)method.invoke(null);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e); // exceptions in streams... lol
}
}).
collect(Collectors.toList());
}
我希望我知道避免演员表的方法,但这对我来说并不是很清楚。
答案 1 :(得分:0)
这是用于调用EntitiesForTest
类的指定方法并收集返回对象的相同代码:
public static List<Entity> allEntities() {
ArrayList<Entity> list = new ArrayList<Entity>();
Method[] ma = EntitiesForTest.class.getMethods();
Object[] emptyObject = new Object[0];
for (int i = 0; i < ma.length; i++) {
if (ma[i].getReturnType().equals(Entity.class) &&
ma[i].getParameterTypes().length == 0 &&
Modifier.isStatic(ma[i].getModifiers())) {
try {
Entity e = (Entity)(ma[i].invoke(null, emptyObject));
list.add(e);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return list;
}
答案 2 :(得分:0)
这个答案有几个假设:
c
,firstEntity
等)。这些可能不成立,因为我们没有secondEntity
的定义或它是如何使用的。
总而言之,我只是删除你的方法。
Entity
答案 3 :(得分:0)
也许使用功能方式(在java 8中)?
public class Entities {
static class Entity{
private String x;
Entity( String x){
this.x = x;
}
public String getX(){
return x;
}
}
public static Entity firstEntity() {
return new Entity("first Entity");
}
public static Entity secondEntity() {
return new Entity("second Entity");
}
public static Entity nthEntity() {
return new Entity("nth Entity");}
@FunctionalInterface interface GetEntity{
public Entity getEntity();
}
public static List<GetEntity> allEntities =
Arrays.asList(Entities::firstEntity,
Entities::secondEntity,
Entities::nthEntity);
public static void main(String ...p){
allEntities
.stream()
.forEach(x->{System.out.println(x.getEntity().getX());});
}
}