如何在没有冗余代码的情况下消除空参数

时间:2011-10-26 02:35:08

标签: java parameters null

例如:

getBooks(author, title)
  • 如果允许作者为null,则会返回所有具有特定标题的书籍
  • 如果允许title为null,则会返回特定作者的所有书籍
  • 如果允许两者都为null,则会返回所有书籍,无论标题或作者如何

要消除这种情况,请具备以下功能:

getBooks(author) 
getBooks(title)  
getBooks(author, title)  
getBooks()

在新函数中,可能存在冗余代码,或者如果我们将这些冗余代码分组到函数中,我们仍然会进入具有空参数的函数。有什么更好的方法来处理这个 - 没有冗余代码和没有空参数?

4 个答案:

答案 0 :(得分:7)

不要过载:

getBooksByAuthor(author) 
getBooksByTitle(title)  
getBooksByAuthorAndTitle(author, title)  
getBooks()

请注意,这不会减少代码重用:这些方法可以在其实现中重用/共享所需的代码

答案 1 :(得分:0)

尝试这种方法:

getAllBooks()            {return getBooks("", "");}
getBooksByAuthor(author) {return getBooks(author, "");}
getBooksByTitle(title)   {return getBooks("", title);}
getBooksByAuthorAndTitle(author, title)
{
    if(author.equals("") && title.equals(""))
    {
        return //your book list
    }
    else if(author.equals(""))
    {
        return //a list of books with the given title
    }
    else if(title.equals(""))
    {
        return //a list of books with given author
    }
    else
    {
        return //a list of books with the given title and author
    }
}

修改的: 更新以避免歧义。

答案 2 :(得分:0)

您可以使用常量来表示要执行的搜索类型,并检查是否传递了参数(非常未经测试并检查错误):

public static final int R_AUTH = 1;
public static final int R_BOOK = 2;
public static final int R_ALL = 3;

public bookSearch( int searchType, String... search )
{
    switch( searchType )
    {
        case R_AUTH:
          // search based off of (String)search[0].stringValue();
        break;
        case R_ALL:
          // load all
        break;
    }
}

bookSearch(R_ALL);
bookSearch(R_AUTH, "Poe");

答案 3 :(得分:0)

假设作者和标题是字符串,您可以执行以下操作:

public List getBooks(String params ...) {
    if (params.length == 0) { //search 
     //do search all books regardless of title or author
    } else if (params.length == 2 && "cte_author".equals(params[1])) {
     //do search  by author
    } else if (params.length == 2 && "cte_title".equals(params[1])) {
     //do search by title
    } else if (params.length == 2){
     //do search by title and book
    } else {
     //throw exception
    }
}

因此您可以使用以下方法:

getBooks();
getBooks("Gabriel Garcia Marquez", "cte_author");
getBooks("Cien anios de soledad", "cte_title");
getBooks("Gabriel Garcia Marquez","Cien anios de soledad");