0

我正在寻找一种设计模式,甚至是关于我前几天看到的一些代码的建议。一般结构是这样的(伪代码):

public String getUrl(){
Person person= new Person();
StringBuilder builder = new StringBuilder();

if(person.getName() != null){
builder.append(",_name=");
builder.append(person.getName());
}

if(person.getLastName() != null){
builder.append(",_lastName=");
builder.append(person.getName());
}

if(person.getPostCode() != null){
builder.append(",_postCode=");
builder.append(person.getPostCode());
}

// So on and so forth
return builder.toString();

}

现在的问题是我无法控制 Person 类(我只是通过 API 调用获得它)。我正在考虑使用反射和这样的地图:

Map<String, String> methodNameToUrlParameter; //Pre Build this map with method name and the actual parameter key
Map<String, String> urlParameterToValue;
Method[] methods = person.getMethods();

    for(Method method: methods ){
        String result = (String) method.invoke(person, null);

          if(result != null){
             String urlParam = methodNameToUrlParameter.get(method.getName());
             urlToValue.put(urlParam, result );
          }

}

然后我可以继续我的快乐之路。但这对我来说似乎不太好,我对反射也不太了解,有什么想法吗?请记住,我无法控制 Person 类,它只有 getter,因为它是不可变的。

谢谢。

编辑:

我要问的是有没有更好的方法来表示这里的逻辑流,而无需使用太多执行空值检查的 if 语句。也许是我不知道的设计模式。

第二次编辑:可能有 20 个 if-null 检查,这让事情变得丑陋。有没有办法做到这一点?

4

2 回答 2

1

使用Apache Commons ToStringBuilderGuava 的 MoreObjects.ToStringHelper。或者受到他们的启发。

于 2013-11-27T20:27:53.903 回答
1

对于具有更好可读性的微小更改,您可以将冗余代码提取到它自己的方法中:

void AddField(StringBuilder builder, String value, String fieldName) {
    if (value != null) {
        builder.append(",_");
        builder.append(fieldName);
        builder.append("=");
        builder.append(value);
    }
}

这会将您的代码示例简化为以下内容:

public String getUrl(){
    Person person= new Person();
    StringBuilder builder = new StringBuilder();

    AddField(builder, person.getName(), "name");
    AddField(builder, person.getLastName(), "lastName");
    AddField(builder, person.getPostCode(), "postCode");

    // So on and so forth
    return builder.toString();

 }
于 2013-11-27T20:57:47.090 回答