0

我有以下代码:

...
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中没有宏?

4

3 回答 3

0

您需要编写处理电话和处理电子邮件的方法。您应该切换 case 语句,而不是使用 if else 循环。我建议安装各种代码质量插件,它们会在您编写 Java 代码时指出您的代码质量问题

于 2013-09-29T08:28:09.037 回答
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);
于 2013-09-29T08:36:35.753 回答
0

您应该创建一个从电子邮件类型的字符串版本到 Email.TYPE_* 的 HashMap。

然后你可以将地图传递给一个函数,例如

int clean(Map<String, Integer> typemap, String type_s) {
    return bar(typemap.get(foo(type_s)));
} 
于 2013-09-29T08:38:07.860 回答