仅使用一种开关方法或四种不同的方法更好?

时间:2019-06-01 03:53:56

标签: java

我有一个对象,并从中得到一些字段,我用switch语句创建了一个方法,这个想法是使它通用,只是通过参数调用此方法,但是现在我不确定。

选项是

private String getCode(Row row, String code) {
    String result;
    switch (code) {
      case code1:
        result = row.getString("constant1");
        break;
      case code2:
        result = row.getString(constant2);
        break;
      case code3:
        result = row.getString(constant3);
        break;
      case code4:
        result = row.getString(constant4);
        break;
      default:
        result = null;
    }
    return result;
  }

private String getcode1(Row row){
    return row.getString("constant1")
  }

  private String getcode1(Row row){
    return row.getString("constant2")
  }
  private String getcode1(Row row){
    return row.getString("constant3")
  }

  private String getcode1(Row row){
    return row.getString("constant4")
  }

我想用更好的方法,我有点困惑

4 个答案:

答案 0 :(得分:3)

如果您输入的代码与常量不同,我将建议采用以下方法。创建一个Enum映射代码和常量。

public enum Mapping {
    MAPPING_FIRST("code1", "constant1"),
    MAPPING_SECOND("code2", "constant2");

    private String code;
    private String constant;

    // constructor and getters

    public static Mapping getMappingFromCode(String code){
       return Arrays.stream(Mapping.values())
          .filter(mapping -> mapping.getCode().equals(code))
          .findFirst()
          .orElse(null);
    }
}

现在,创建一种从行访问值的方法。

private String getValue(Row row, String code) {
   Mapping mapping = Mapping.getMappingFromCode(code);

   if(mapping == null){
      return null;
   }
   return row.getString(mapping.getConstant());
}

答案 1 :(得分:3)

答案都不是。

这里提供的是一个价值转换过程。 这是如何工作的?据我所知,您需要以key-value对的形式存储数据,其中key必须是唯一的。这就是Java中HashMap的定义。

此外,因为您使用的是Switch,所以我假设您可以使用一些唯一的密钥来标识数据。每个code的度量只有一个constant但是我们如何将其应用于我的问题?好吧,我认为您从中提取了一个row来收集了数据。现在,您想通过row访问此codeValue的值(简称为constant),但是要获得此constant,您需要一个{{1} }。像这样:code

我该如何实现?

好吧,我们将需要一个名为code->constant->codeValue的{​​{1}},它将其键定义为HasMap()并将值定义为constants。现在,如果您知道每个codes,就可以轻松获得它们。显然,如果得到constants,也可以得到每个`行的constant,如下所示:

code

答案 2 :(得分:1)

这个问题有点小,但我会尽力解释。对我来说,第二个选择是“不”。为什么?您正在制作必须通过一些if / else语句进行整理的方法,例如:

if (code.equals(code1))
    someString = getcode1(row);
else if (code.equals(code2))
    somestring = getcode2(row);
else if (code.equals(code3))
    someString = getcode3(row);
else
    someString = getcode4(row);

为什么不使用这个:

if (code.equals(code1))
    someString = row.getString("content1");
else if (code.equals(code2))
    somestring = row.getString("content2");
else if (code.equals(code3))
    someString = row.getString("content3");
else
    someString = row.getString("content4");

我可以看到第一个被使用,但是那里有替代方法。为我们提供包含整个类和方法的完整的最低要求代码,与使用这些代码段相比,我们可以为您提供更多帮助。

答案 3 :(得分:0)

创建用于枚举代码和常量的枚举。在该枚举中,创建一个通用方法,您可以在其中通过参数传递代码。

public enum MyEnum {

    CODE1("constant1"), CODE2("constant2");

    private String constant;

    public String getConstant() {
        return constant;
    }

    private MyEnum(String constant) {
        this.constant = constant;
    }

    private static String getConstant(String code) {
        return Arrays.stream(MyEnum.values()).filter(mapping -> mapping.name().equalsIgnoreCase(code))
                .map(e -> e.getConstant()).findAny().orElse(null);
    }

    public static String getCode(Row row, String code) {
        String constant = getConstant(code);
        return constant != null ? row.get(constant) : null;

    }

}

您可以通过调用通用方法 getCode()从行对象获取代码。

MyEnum.getCode(row, "code1")