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

这个java代码的更好的模式/设计?,java,Java,用于人员搜索的LinkedIn rest API具有以下格式http://api.linkedin.com/people-search?search-param1=val1&search-param2=val2… 由于我打算在我的应用程序中使用这么多时间,我正在尝试创建一个类似这样的Search对象,我们可以在其中为不同的搜索参数设置值,然后使用一个名为generatequalyURL的方法来生成上述格式的url public class Search { private String se

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

由于我打算在我的应用程序中使用这么多时间,我正在尝试创建一个类似这样的
Search
对象,我们可以在其中为不同的搜索参数设置值,然后使用一个名为
generatequalyURL
的方法来生成上述格式的url

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
,然后附加相应的参数名,该值似乎会给我添加冗余代码


另外,请告诉我这种方法是否合适。

您可以维护一个映射,其中键作为参数名称,值作为值。setter方法可以在映射中放置键和值。或者,您可以有一个接受名称和值的通用setter。 在generateQueryUrl方法中,您可以在地图上迭代


如果在后面的阶段没有进行,您可能还需要对值进行URL编码。

您可以维护一个映射,其中键作为参数名称,值作为值。setter方法可以在映射中放置键和值。或者,您可以有一个接受名称和值的通用setter。 在generateQueryUrl方法中,您可以在地图上迭代


如果在后面的阶段没有完成,您可能还需要对值进行URL编码。

我认为您所设计的实际上是一个“构建器”,因为您正在构建最终将返回的URL。想想
StringBuilder
,或者Apache的
EqualsBuilder
HashCodeBuilder
,等等

要获得更多的理论解释,请检查

现在,对于您的代码,为了正确地构建URL,我会像您一样使用“set”方法,但在这些方法中,我会使用Apache来正确地附加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;
  }
公共类搜索生成器{
私有URI baseUri;
私有列表参数;
公共搜索生成器(URI baseUri){
this.baseUri=baseUri;
this.parameters=new ArrayList();
}
public void addSearchParam1(字符串val){
如果(!StringUtils.isBlank(val)){
添加(新的BasicNameValuePair(“SearchParam1”,val));
}
}
//形成查询url
公共旅游{
URI URI=URIUtils.createURI(baseUri.getScheme(),baseUri.getHost(),baseUri.getPort(),baseUri.getPath(),URLEncodedUtils.format(参数“UTF-8”),null);
返回uri;
}

编辑:我添加了“isBlank”检查,以确保不向查询中添加带有null、空的纯空白字符串的参数。现在,您可以将其更改为仅检查null,但我相信您已经了解了这一点。

我认为您设计的实际上是一个“生成器”,因为您正在构建将在最后返回的URL。请考虑
StringBuilder
,或者Apache的
equalBuilder
HashCodeBuilder
,等等

要获得更多的理论解释,请检查

现在,对于您的代码,为了正确地构建URL,我会像您一样使用“set”方法,但在这些方法中,我会使用Apache来正确地附加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;
  }
公共类搜索生成器{
私有URI baseUri;
私有列表参数;
公共搜索生成器(URI baseUri){
this.baseUri=baseUri;
this.parameters=new ArrayList();
}
public void addSearchParam1(字符串val){
如果(!StringUtils.isBlank(val)){
添加(新的BasicNameValuePair(“SearchParam1”,val));
}
}
//形成查询url
公共旅游{
URI URI=URIUtils.createURI(baseUri.getScheme(),baseUri.getHost(),baseUri.getPort(),baseUri.getPath(),URLEncodedUtils.format(参数“UTF-8”),null);
返回uri;
}

编辑:我添加了“isBlank”检查,以确保不向查询中添加带有null、空的纯空白字符串的参数。现在,您可以将其更改为仅检查null,但我相信您已经了解了这一点。

请忽略诸如extra和sign结尾之类的小缺陷。请忽略诸如extra和sign结尾之类的小缺陷。