如何避免大量的if else条件语句

4

我已经阅读了很多关于代码重构和避免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条件语句,但我不知道该使用什么。

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

谢谢


4
你可以使用switch-case语句或静态映射。 - Oleksandr Riznyk
3
你可以使用 Map - sidgate
1
你可以使用 switch-case 语句,为了让代码更易读,你可以使用枚举。 - Amit Kumar Lal
1
@Hades,你能告诉我如何将它转换为枚举类型吗? - Amrendra Kumar
1
同时,XSIType 强烈暗示您正在手动解析 XML。在可能的情况下,最好使用库和转换语言来处理 XML。 - Ryan Leach
显示剩余3条评论
4个回答

7

以下是您需要的内容:

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;
}

2
< p > 使用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语句中不能使用||运算符,但是可以定义穿透语句。
...
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语句的末尾。它可用于在以上所有情况都不为真时执行一个动作。


1
你可以尝试使用stream()函数,以及其内部的map和filter函数。同时,你也可以尝试创建字符串的ArrayList,然后在循环中(或者最好是在其他函数中)检查它们是否与fieldtype相等。如果其中一个相等,则返回true,否则返回false。
现在可以添加一个函数来检查是否相等,这会让代码稍微短一点。

嗨,欢迎来到Stack Overflow。稍加努力,这篇回答就可以变得非常优秀,如果您能够附上一些代码的话。由于您提供了多个解决方案,我建议您选择其中一个最好的进行详细阐述,将其他的作为尝试的建议留下。 - Ryan Leach

0
这是使用枚举和匹配表达式来实现的示例,使代码更易读。
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"));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接