我正在寻找一种设计模式,甚至是我前几天看到的一些代码的建议。一般结构是这个(伪代码):
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检查,这使得事情变得丑陋。有什么方法可以没有吗?
答案 0 :(得分:1)
使用Apache Commons ToStringBuilder或Guava's MoreObjects.ToStringHelper。或者从他们那里获得灵感。
答案 1 :(得分: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();
}