创建方法过滤器

时间:2011-07-05 18:15:11

标签: java language-agnostic filter

在我的代码中,我有一个List<Person>。此列表中对象的属性可能包含以下内容:

  • ID
  • 名字
  • 姓氏

在我的应用程序的一部分中,我将允许用户使用这三个值的任意组合来搜索特定的人。目前,我有一个switch语句,只需检查哪些字段已填写,并调用为该值组合指定的方法。

即:

switch typeOfSearch    
if 0, lookById()    
if 1, lookByIdAndName()  
if 2, lookByFirstName()

等等。实际上有7种不同的类型。

这让我对每个语句都有一个方法。这是一个'好'的方法吗?有没有办法让我使用参数或某种“过滤器”?它可能没什么区别,但我用Java编写它。

4 个答案:

答案 0 :(得分:3)

您可以使用地图和界面做更精彩的事情。试试这个例子,

interface LookUp{
    lookUpBy(HttpRequest req);
}

Map<Integer, LookUp> map = new HashMap<Integer, LookUp>();

map.put(0, new LookUpById());
map.put(1, new LookUpByIdAndName());

...

控制器中,然后就可以

int type = Integer.parseInt(request.getParameter(type));
Person person = map.get(type).lookUpBy(request);

这样您就可以使用地图快速查找方法。当然你也可以使用长开关,但我觉得这更易于管理。

答案 1 :(得分:0)

如果好意味着“语言为我做了”,不。

如果good表示'可读',我会在Person中定义一个方法match(),如果该对象符合您的搜索条件,则返回true。此外,可能是创建方法Criteria的好方法,您可以在其中封装搜索条件(您要查找哪些字段以及哪个值)并将其传递给匹配(条件标准)。

答案 2 :(得分:0)

这种快速做法变得无法管理,因为组合的数量很快变得很大。 创建一个包含所有可能的查询参数的PersonFilter类,并访问列表中的每个人:

private class PersonFilter {
    private String id;
    private String firstName;
    private String lastName;

    // constructor omitted

    public boolean accept(Person p) {
        if (this.id != null && !this.id.equals(p.getId()) {
            return false;
        }
        if (this.firstName != null && !this.firstName.equals(p.getFirstName()) {
            return false;
        }
        if (this.lastName != null && !this.lastName.equals(p.getLastName()) {
            return false;
        }

        return true;
    }
}

现在通过

实现过滤
public List<Person> filter(List<Person> list, PersonFilter filter) {
    List<Person> result = new ArrayList<Person>();
    for (Person p : list) {
        if (filter.accept(p) {
            result.add(p);
        }
    }
    return result;
}

答案 3 :(得分:0)

在某些时候,你应该看看像Lucene这样的东西,这将为你提供这种搜索的最佳可扩展性,可管理性和性能。我不知道您处理的数据量建议使用更长的解决方案来搜索更大的对象集。这是一个了不起的工具!