合并两个非常相似的方法

时间:2011-10-08 12:17:39

标签: java jsf

我有这种理论情况:

表单
  • 2个输入 [对象attr1的[attr2item个** **

    <h:inputText id="attr1" value="#{bean.item.attr1}"/> 
    <h:inputText id="attr2" value="#{bean.item.attr2}"/>
    
  • 2提交按钮 [按attr1搜索,在{dtb中搜索attr2]在foo.xhtml中:

    <h:commandButton id="search1" action="#{bean.search1}" /> 
    <h:commandButton id="search2" action="#{bean.search2}" />
    
bean.java中的

两个非常相似的方法

public void search1(){
    try 
    {
      session = DaoSF.getSessionFactory().openSession();
      Criteria criteria = session.createCriteria(Foo.class);
      criteria.add(Restrictions.like("attr1", item.getAttr1()));
      dataList = criteria.list();
    } 
    catch (Exception e) {...}
  }

  public void search2(){
    try 
    {
      session = DaoSF.getSessionFactory().openSession();
      Criteria criteria = session.createCriteria(Foo.class);
      criteria.add(Restrictions.like("attr2", item.getAttr2()));
      dataList = criteria.list();
    } 
    catch (Exception e) {...}
  }

有没有办法将这两种方法合并为一种?

UPDATE:还合并了commandButtons的动作?

解决方案:

private void search(String field, String value)
action="#{bean.search('attr2', bean.item.attr1)}"

3 个答案:

答案 0 :(得分:2)

当然:寻找相同的东西,以及有什么不同。您没有提供足够的信息来了解这是否可行:

public void search(String sAttr, T attr) {
    try {
        session = DaoSF.getSessionFactory().openSession();
        Criteria criteria = session.createCriteria(Foo.class);
        criteria.add(Restrictions.like(sAttr, attr));
        dataList = criteria.list();
    } catch (Exception e) {...}
}

如果属性类型不一样,那就更令人恼火了,而Java带来的快乐也让它变得丑陋。

在某些时候,你最终会得到一个带Criteria的方法,你可以在运行中创建它们并将它们传递给包装try / catch和list的东西,或者你最终创建一个接口并将实现传递给它。

另一方面,IMO创建的副作用依赖关系(如在搜索方法中设置dataList)最终会导致眼泪:考虑从方法中返回列表,即使您只是将其设置为属性被传递给使用它的任何东西。

答案 1 :(得分:2)

只需传递与参数不同的内容:

public void search(String param, Attr attr){
    try 
    {
      session = DaoSF.getSessionFactory().openSession();
      Criteria criteria = session.createCriteria(Foo.class);
      criteria.add(Restrictions.like(param, attr));
      dataList = criteria.list();
    } 
    catch (Exception e) {...}
  }

答案 2 :(得分:2)

您可以创建第三个方法并从这些方法中调用它:

private void doSearch(String field, String value) {
  session = DaoSF.getSessionFactory().openSession();
  Criteria criteria = session.createCriteria(Foo.class);
  criteria.add(Restrictions.like(field, value));
  dataList = criteria.list();
}

public void search1() {
  doSearch("attr1", item.getAttr1());
}

public void search2() {
  doSearch("attr2", item.getAttr2());
}