叫方法动态方式

时间:2016-02-01 18:44:34

标签: java

我有一个包含100个get方法的类。

例如:

public class ResponsseDetails {
    public String getResponse2() {
        return response2;
      }
      public String getResponse3() {
        return response3;
      }
      public String getResponse4() {
        return response4;
      }
      public String getResponse5() {
        return response5;
      }
      public String getResponse6() {
        return response6;
      }
      public String getResponse7() {
        return response7;
      }

    .....
    .....

    public String getResponse100() {
            return response100;
          }
}

现在我尝试通过以下方式在for循环中获取这些变量:

ResponseDetails responseDetails = new ResponseDetails();

for(SetWiseQuesDetailTable setDetails : result_2) {
          if (setDetails.getQa() != null) {
            if (setDetails.getQa().equals(responseDetails.getResponse1())) {
              ansDetailsList.add("V");
            }
            if (setDetails.getQa().equals(responseDetails.getResponse2())) {
              ansDetailsList.add("V");
            }
            ......
            ......
            if (setDetails.getQa().equals(responseDetails.getResponse100())) {
                  ansDetailsList.add("V");
            }

          }
}

在上面的代码中,我编写了100 if - else来获取100个非常长的过程。还有其他最好的方法来实现上面的代码吗?

3 个答案:

答案 0 :(得分:0)

您可以使用HashMap

来实现此目的
HashMap<String,String> hashmap = new HashMap();
hashmap.put("response1","key1");
hashmap.put("response2","key2");
//Add upto 100 key value pairs as per your requirement

现在你可以像这样获得hashmap的值;

String key = setDetails.getQa();

if(key != null) {
 if(hashmap.containsKey(key)){

    String value = (String) hashmap.get(key);
     ansDetailsList.add(value);
 }
}

答案 1 :(得分:0)

您可以使用Reflection进行此操作。有一个名为Reflections的简洁库,您可以这样做:

Set<Method> methods = ReflectionUtils.getAllMethods(ResponseDetails.class, ReflectionUtils.withPrefix("getResponse"),
                                                        ReflectionUtils.withParametersCount(0), ReflectionUtils.withReturnType(String.class));

    for(SetWiseQuesDetailTable setDetails : result_2) {
        for (Method method : methods) {
            String response = (String) method.invoke(responseDetails);
            if (setDetails.getQA().equals(response)) {
                ansDetailsList.add("V");
            }
        }
    }

基本上,ReflectionUtils允许你获取所有“getResponse”方法,然后迭代它们通过反射调用它们并将它们与你想要的任何东西进行比较。

答案 2 :(得分:0)

您是否需要公开提供字符串? (您正在使用public方法,这就是我要问的原因)。如果不这样做,以下代码可能更好/更清楚:

for(SetWiseQuesDetailTable setDetails : result_2) {
      // this prevents calling the function getQa() over and over again
      String qa = setDetails.getQa();
      if (qa != null) {
        switch (qa) {
          case "response1" : 
              // do your stuff here
              break; // you shouldn't forget this one here
          [...]
          case "response1000": // procced as above
        }
     }
}

使用开关(例如here)可以很好地捕捉您对100倍决定的看法。请注意,这将阻止从课堂外看到的响应。这可能是一个问题。

查看代码&#34;清洁度&#34;您应该选择 Anshul Jain's解决方案,因为这不仅可以使您的代码更容易适应(您可以动态添加或删除来自&#34;数据库的响应&#34;)它还可以提高可读性(只有一个地方可以看正在发生的事情)并删除错误来源。当您复制代码100次时,这是一个问题。如果您需要更改某些内容,则还需要在其他99个地方进行更改。这可能会因忘记单个案例或简单的错误拼写错误而导致错误。