如何计算类型"对象"在运行时选择

时间:2017-05-31 20:23:31

标签: java oop

我需要计算一个特定的对象,但我只知道在运行时哪个对象。 现在我有类似

的东西
public class Details {
    private String typeOfObjectRequired;
    private int numberOfObjectRequired;
}

在另一堂课中我有

public class Container {
    private List<Type1> type1List;
    private List<Type2> type2List;
    private Type3 type3Object;

    public int countType1() {
        return type1List.size();
    }

    public int countType2() {
        return type2List.size();
    }

    public int countType3() {
        return type3Object.getNumberOfSomething();
    }

}

现在我这样做(在第三个类中同时包含Details和Container作为属性)

public boolean hasNumberOfObjectRequired() {
    int count = 0;
    String type = details.getTypeOfObjectRequired();

    if(type.equals("type1")) count = container.countType1();
    else if (type.equals("type2")) count = container.countType2();
    else if (type.equals("type3")) count = container.countType3();

    if (count > details.getNumberOfObJectRequired) return true;
    return false;
}

有更好的方法吗?我不想拥有这么多,如果因为我有超过3种不同的类型。

编辑: 现在我有5种不同的类型,我总是只需要其中一种。 基本上我想基于String

调用不同的方法

2 个答案:

答案 0 :(得分:1)

Container类可以包含Map列出的列表:

class Container {
    private Map<String, List<?>> lists = new HashMap<>();

    private List<TypeOne> first = ...;
    private List<TypeTwo> second = ...;

    public Container() {
        lists.put("type1", first);
        lists.put("type2", second);
    }

    public int count(String type) {
        return lists.get(type).size();
    }
}

您可以致电count

,根据类型获取尺寸
public boolean hasNumberOfObjectRequired() {
    String type = details.getTypeOfObjectRequired();
    int requiredCount = details.getNumberOfObjectRequired();

    return container.count(type) >= requiredCount;
}

答案 1 :(得分:0)

你可以使用反射......

public boolean hasNumberOfObjectRequired() {
int count = 0; 
String type = details.getTypeOfObjectRequired(); 
Method m = Container.class.getMethod("countType"+type.charAt(4));
return m.invoke(container) > details.getNumberOfObJectRequired);
}

或者您可以使用开关

switch(type){
case "type1":
count = ...
break;
case "type2"
....
}

如果type是int而不是字符串

,那就更好了