这个java代码更好的模式/设计?

时间:2012-03-09 07:25:21

标签: java

用于人员搜索的LinkedIn休息API具有以下格式http://api.linkedin.com/people-search?search-param1=val1&search-param2=val2...

由于我打算在我的应用程序中使用这么多次,我试图创建一个这样的Search对象,我们可以为不同的搜索参数设置值,然后创建一个名为generateQueryUrl的方法来生成以上格式的网址。

public class Search {
  private String searchParam1;
  private String searchParam2;

  public void setSearchParam1(String val) { this.searchParam1 = val; }
  public void setSearchParam2(String val) { this.searchParam2 = val; }

  //Form the query url
  public String generateQueryUrl(){
    String url = "";  
    if(searchParam1 != null) {
        url += "search-param1=" +  searchParam1 + "&";
    }
    if(searchParam2 != null) {
        url += "search-param2=" +  searchParam2 + "&";
    }
    return url;
 }    

我的问题是,有没有更好的模式/设计来做到这一点?如果有很多参数,检查NULL然后附加相应的参数名称,值似乎会为我添加冗余代码。

如果这种方法没问题,也请告诉我。

2 个答案:

答案 0 :(得分:3)

您可以将带有键的Map维护为param名称和值作为值。您的setter方法可以将键和值放在Map中。或者,您可以拥有一个接受名称&的通用setter。价值。 在generateQueryUrl方法中,您可以迭代Map。

如果没有在稍后阶段完成,您可能还想对这些值进行URLEncode。

答案 1 :(得分:3)

我认为你所设计的实际上是一个“构建器”,因为你正在构建最后会返回的URL。想想StringBuilder,或者Apache的EqualsBuilderHashCodeBuilder等等。

有关更多理论解释,请查看http://sourcemaking.com/design_patterns/builder

现在,至于你的代码,为了正确构建URL,我会像你一样使用“set”方法,但在其中我会使用Apache的HttpComponents (ex HttpClient)来正确附加URL的参数。

考虑一下,如果插入“&”在其中一个参数的值中,您的查询参数将被搞砸,因为您通常必须转义此字符(并且您似乎没有在此处执行此操作)。我更喜欢让测试和已知的API(UriUtils)为我做这件事。

所以,我的类看起来像使用Apache的HttpComponents:

public class SearchBuilder {
  private URI baseUri;
  private List<NameValuePair> parameters;

  public SearchBuilder (URI baseUri) {
    this.baseUri= baseUri;
    this.parameters = new ArrayList<NameValuePair>();
  }

  public void addSearchParam1(String val) { 
    if(!StringUtils.isBlank(val)) {
      parameters.add(new BasicNameValuePair("SearchParam1", val));
    }
  }

  //Form the query url
  public URI toURI(){
    URI uri = URIUtils.createURI(baseUri.getScheme(), baseUri.getHost(), baseUri.getPort(), baseUri.getPath(), URLEncodedUtils.format(parameters, "UTF-8"), null);
    return uri;
  }

编辑:我添加了“isBlank”检查,以确保没有空白的只有空格的字符串的参数将不会添加到查询中。现在,您可以将其更改为仅检查null,但我确信您有了这个想法。