如何避免很多 if else 条件
How to avoid a lot of if else conditions
我已经阅读了很多关于代码重构和避免 if else 语句的主题。实际上,我有一个 class,我在其中使用了很多 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 条件,但我不知道是什么。
你能给我一个例子或一个好的教程页面吗?
谢谢
这是您需要的:
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;
}
您可以尝试 stream() 及其功能:映射和过滤器。
此外,您可以尝试执行字符串的 ArrayList,然后检查循环(或最好在其他函数中循环)是否等于字段类型。如果其中之一是,你 return 正确,否则,你 return 错误。
现在的一点帮助可能是添加函数检查它是否等于 fieldtype(它会稍微短一点)。
enum
和 switch
语句的组合对您的示例很方便:
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
case,它必须出现在switch
语句的末尾。当上述情况 none 为真时,它可用于执行操作。
下面是使用 Enum 和 matches 表达式执行此操作的示例,这使代码更具可读性。
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"));
}
}
我已经阅读了很多关于代码重构和避免 if else 语句的主题。实际上,我有一个 class,我在其中使用了很多 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 条件,但我不知道是什么。
你能给我一个例子或一个好的教程页面吗?
谢谢
这是您需要的:
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;
}
您可以尝试 stream() 及其功能:映射和过滤器。 此外,您可以尝试执行字符串的 ArrayList,然后检查循环(或最好在其他函数中循环)是否等于字段类型。如果其中之一是,你 return 正确,否则,你 return 错误。
现在的一点帮助可能是添加函数检查它是否等于 fieldtype(它会稍微短一点)。
enum
和 switch
语句的组合对您的示例很方便:
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
case,它必须出现在switch
语句的末尾。当上述情况 none 为真时,它可用于执行操作。
下面是使用 Enum 和 matches 表达式执行此操作的示例,这使代码更具可读性。
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"));
}
}