繁体   English   中英

POJO对象的long if语句的设计模式

[英]Design pattern for long if null statements for POJO object

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

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检查,这使得事情变得丑陋。 有没有办法没有没有?

使用Apache Commons ToStringBuilderGuava的MoreObjects.ToStringHelper 或者从他们那里获得灵感。

对于具有更好可读性的微小更改,您可以将冗余代码拉入其自己的方法:

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();

 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM