我有以下代码:
...
if (...) { // Handling emails
int emailType = -1;
if (types != null) {
String type = foo(types);
if (type.equals("work")) {
emailType = Email.TYPE_WORK; // android.provider.ContactsContract.CommonDataKinds.Email
} else if (type.equals("home")) {
veemailType = Email.TYPE_HOME;
} else if (type.equals("mobile")) {
emailType = Email.TYPE_MOBILE;
} else if (type.equals("other")) {
emailType = Email.TYPE_OTHER;
}
bar(emailType);
}
} else if (...) { // Handling phones
int telType = -1;
if (types != null) {
String type = foo(types);
if (type.equals("work")) {
telType = Phone.TYPE_WORK; // android.provider.ContactsContract.CommonDataKinds.Phone
} else if (type.equals("home")) {
telType = Phone.TYPE_HOME;
} else if (type.equals("mobile")) {
telType = Phone.TYPE_MOBILE;
} else if (type.equals("other")) {
telType = Phone.TYPE_OTHER;
}
bar(telType);
}
} else if ...
显然我应该使用一个函数来包装这些类似的处理逻辑,但不知道如何去做。
使用C/C++
在这种情况下我更喜欢宏,但看起来Java中没有宏?
答案 0 :(得分:0)
您需要编写处理电话和处理电子邮件的方法。您应该切换case语句,而不是使用if else循环。我建议安装各种代码质量的插件,这些插件会在您编写Java代码时指出代码质量问题
答案 1 :(得分:0)
这里的一个选择是去除int常量并使用工厂方法引入枚举类以从字符串生成值:
public enum Email{
TYPE_HOME("home"),
TYPE_MOBILE("mobile"),
TYPE_OTHER("other"),
TYPE_WORK("work");
private final String stringValue;
Email(String stringValue) {
this.stringValue = stringValue;
}
public static Email parse(String value){
for (Email email : values()){
if (email.stringValue.equals(value)){
return email;
}
}
throw new IllegalArgumentException("Illegal argument: " + value);
}
}
现在您可以使用以下内容替换if-else链:
String types = foo(types);
Email email = Email.parse(types);
bar(email);
答案 2 :(得分:0)
您应该从电子邮件类型的字符串版本创建HashMap到Email.TYPE _ *。
然后你可以将地图传递给一个函数,例如
int clean(Map<String, Integer> typemap, String type_s) {
return bar(typemap.get(foo(type_s)));
}