通过映射将代码重构为函数

时间:2013-09-29 08:24:28

标签: java function macros refactoring

我有以下代码:

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

3 个答案:

答案 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)));
}