【问题标题】:How to avoid a lot of if else conditions [duplicate]如何避免很多if else条件[重复]
【发布时间】:2019-03-27 12:23:51
【问题描述】:

我已经阅读了很多关于代码重构和避免 if else 语句的主题。实际上,我有一门课使用了很多 if - else 条件。

private static String getXSIType(String fieldType) {
    if ("_freeFormText".equals(fieldType) || "_eMailAddress".equals(fieldType) || "_help".equals(fieldType)
            || "_hyperlink".equals(fieldType) || "_inlineText".equals(fieldType) || "_longText".equals(fieldType)
            || "_password".equals(fieldType) || "_phoneNumber".equals(fieldType) || "_richText".equals(fieldType)
            || "_textArea".equals(fieldType)) {

        return "platformCore:StringCustomFieldRef";

    } else if ("_integerNumber".equals(fieldType)) {
        return "platformCore:LongCustomFieldRef";

    } else if ("_multipleSelect".equals(fieldType)) {
        return "platformCore:MultiSelectCustomFieldRef";

    } else if ("_document".equals(fieldType) || "_listRecord".equals(fieldType) || "_image".equals(fieldType)) {
        return "platformCore:SelectCustomFieldRef";

    } else if ("_currency".equals(fieldType) || "_decimalNumber".equals(fieldType)
            || "_percent".equals(fieldType)) {
        return "platformCore:DoubleCustomFieldRef";

    } else if ("_checkBox".equals(fieldType)) {
        return "platformCore:BooleanCustomFieldRef";

    } else if ("_date".equals(fieldType) || "_datetime".equals(fieldType) || "_timeOfDay".equals(fieldType)) {
        return "platformCore:DateCustomFieldRef";

    }
    return "platformCore:StringCustomFieldRef";
}

现在,我想使用其他东西,而不是那些 if else 条件,但我不知道是什么。

你能给我一个例子或一个好的教程页面吗?

谢谢

【问题讨论】:

  • 可以使用switch-case语句或者静态map
  • 你可以使用Map
  • 您可以使用 switch-case 并让代码更具可读性,您可以使用 Enums
  • 如果您的 java 版本支持字符串的 Switch case,您可以使用 Switch case。
  • @Hades 你能告诉我如何将它转换成枚举吗?

标签: java xml if-statement conditional-statements netsuite


【解决方案1】:

这里是使用 Enum 和匹配表达式的示例,它使代码更具可读性。

import java.io.IOException;

public class Test {
    public enum Types{
        INTEGER_NUM("_integerNumber"), MULTI_SELECT("_multipleSelect"), DOC("_document"), CURRENCY("_currency"), CHK_BOX("_checkBox"), DATE("_date"),
        DEC_NUM("_decimalNumber"), LIST_RCRD("_listRecord"), IMG("_image"), DTTM("_datetime"), TIMESTAMP("_timeOfDay");

        private String type ;
        private Types(String type) {
            this.type = type;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }   
        public static Types getEnum(String str){
            for (Types type : Types.values()) {
                if(type.getType().equalsIgnoreCase(str)){
                    return type;
                }
            }
            return null;
        }   
    }   
    private static String getXSIType(String fieldType) {

        if(fieldType.matches("_freeFormText|_eMailAddress|_help|_hyperlink|_inlineText|_longText|_password|_phoneNumber|_richText|_textArea")){
            return "platformCore:StringCustomFieldRef"; 
        }   
        switch (Types.getEnum(fieldType)) {
        case INTEGER_NUM:   return "platformCore:LongCustomFieldRef";
        case MULTI_SELECT:  return "platformCore:MultiSelectCustomFieldRef";
        case DOC:           
        case LIST_RCRD:     
        case IMG:           return "platformCore:SelectCustomFieldRef";
        case CURRENCY:     
        case DEC_NUM:       return "platformCore:DoubleCustomFieldRef";
        case CHK_BOX:       return "platformCore:BooleanCustomFieldRef";
        case DATE:          
        case DTTM:          
        case TIMESTAMP:     return "platformCore:DateCustomFieldRef";       
        default:            return "platformCore:StringCustomFieldRef";
        }
    }
    public static void main(String[] args) throws IOException { 
        System.out.println(getXSIType("_integerNumber"));
    }
}

【讨论】:

    【解决方案2】:

    enumswitch 语句的组合对于您的示例很方便:

    private static String getXSIType(String fieldType) {
    
        FieldType foundFieldType = FieldType.findByValue(fieldType);
        if(foundFieldType == null) {
            return CustomFieldRef.STRING.getValue();
        }
        switch(foundFieldType) {
        case FREE_FORM_TEXT:
        case EMAIL_ADRESS:
        case HELP:
        case HYPERLINK:
        case INLINE_TEXT:
        case LONG_TEXT:
        case PASSWORD:
        case PHONE_NUMBER:
        case RICH_TEXT:
        case TEXT_AREA:
            return CustomFieldRef.STRING.getValue();
        case INTEGER_NUMBER:
            return CustomFieldRef.LONG.getValue();
        case MULTIPLE_SELECT:
            return CustomFieldRef.MULTI_SELECT.getValue();
        case DOCUMENT:
        case LIST_RECORD:
        case IMAGE:
            return CustomFieldRef.SELECT.getValue();
        case CURRENCY:
        case DECIMAL_NUMBER:
        case PERCENT:
            return CustomFieldRef.DOUBLE.getValue();
        case CHECK_BOX:
            return CustomFieldRef.BOOLEAN.getValue();
        case DATE:
        case DATETIME:
        case TIME_OF_DAY:
            return CustomFieldRef.DATE.getValue();
        default:
            return CustomFieldRef.STRING.getValue();
        }
    }
    
    enum FieldType {
    
        FREE_FORM_TEXT("_freeFormText"),
        EMAIL_ADRESS("_eMailAddress"),
        HELP("_help"),
        HYPERLINK("_hyperlink"),
        INLINE_TEXT("_inlineText"),
        LONG_TEXT("_longText"),
        PASSWORD("_password"),
        PHONE_NUMBER("_phoneNumber"),
        RICH_TEXT("_richText"),
        TEXT_AREA("_textArea"),
        INTEGER_NUMBER("_integerNumber"),
        MULTIPLE_SELECT("_multipleSelect"),
        DOCUMENT("_document"),
        LIST_RECORD("_listRecord"),
        IMAGE("_image"),
        CURRENCY("_currency"),
        DECIMAL_NUMBER("_decimalNumber"),
        PERCENT("_percent"),
        CHECK_BOX("_checkBox"),
        DATE("_date"),
        DATETIME("_datetime"),
        TIME_OF_DAY("_timeOfDay");
    
        private final String value;
    
        FieldType(String fieldType) {
            this.value = fieldType;
        }
    
        public static FieldType findByValue(final String value) {
            return Arrays.stream(FieldType.values())
                    .filter(o -> StringUtils.equals(o.value, value))
                    .findFirst()
                    .orElse(null);
        }
    }
    
    enum CustomFieldRef {
    
        STRING("String"),
        LONG("Long"),
        DOUBLE("Double"),
        BOOLEAN("Boolean"),
        DATE("Date"),
        SELECT("Select"),
        MULTI_SELECT("MultiSelect");
    
        private final String value;
    
        CustomFieldRef(String customFieldRef) {
            this.value = customFieldRef;
        }
    
        public String getValue() {
            String prefix = "platformCore";
            String suffix = "CustomFieldRef";
            return String.format("%s:%s%s", prefix, value, suffix);
        }
    }
    

    在这种情况下不需要break,因为return 会停止执行getXSIType() 函数。

    switch 语句中,您不能使用|| 运算符,而是可以定义fall through 语句:

    ...
    case PHONE_NUMBER:
    case RICH_TEXT:
    case TEXT_AREA:
        return CustomFieldRef.STRING.getValue();
    

    这相当于:

    if(FieldType.findByValue(fieldType).equals(FieldType.PHONE_NUMBER)
    || FieldType.findByValue(fieldType).equals(FieldType.RICH_TEXT)
    || FieldType.findByValue(fieldType).equals(FieldType.TEXT_AREA)) {
        return CustomFieldRef.STRING.getValue();
    }
    

    switch 语句可以有一个可选的default 大小写,它必须出现在switch 语句的末尾。当上述情况都不成立时,它可用于执行操作。

    【讨论】:

      【解决方案3】:

      这是你需要的:

      private static String getXSIType(String fieldType) {
          String result=new String();
          switch (fieldType)
          {
              case "_checkBox":
                  result="platformCore:BooleanCustomFieldRef";
                  break;
              case "_integerNumber":
                  result="platformCore:LongCustomFieldRef";
                  break;
              case "_multipleSelect":  
                  result="platformCore:MultiSelectCustomFieldRef";
                  break;
      
              case "_currency":
              case "_decimalNumber":
              case "_percent":
                  result="platformCore:DoubleCustomFieldRef";
                  break;
      
              case "_document":
              case "_listRecord":
              case "_image": 
                  result="platformCore:SelectCustomFieldRef";
                  break;
              case "_date":
              case "_datetime":
              case "_timeOfDay":
                  result="platformCore:DateCustomFieldRef";
                  break;
      
              case "_freeFormText":
              case "_eMailAddress":
              case "_help":
              case "_hyperlink":
              case "_inlineText":
              case "_longText":
              case "_password":
              case "_phoneNumber":
              case "_richText":
              case "_textArea":
                  result="platformCore:StringCustomFieldRef";
                  break;      
              default:
                  result="platformCore:StringCustomFieldRef";
                  break;
          }
          return result;
      }
      

      【讨论】:

        【解决方案4】:

        你可以试试 stream() 和它的功能:map 和 filter。 您也可以尝试执行字符串的 ArrayList,然后在循环中检查(或者最好在其他函数中循环),如果它们等于字段类型。如果其中一个是,则返回 true,否则返回 false。

        现在的一点帮助可能是添加函数检查它是否等于 fieldtype(它会短一点)。

        【讨论】:

        • 您好,欢迎来到堆栈溢出,稍加工作,如果您包含一些代码,这可以成为一个很好的答案。由于您提供了多种解决方案,我建议您选择您认为最好的解决方案,并将其他解决方案留作建议尝试。
        猜你喜欢
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-11
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多