2014-02-28 46 views
0

可以說,我們有這樣的方法:如何擴展僅需要新參數的方法?

public List<Animal> findByKeyword(String keyword){ 
    List<Animal> animals = new ArrayList<Animal>(); 
    // Validate keyword is not null etc.. 
    // hit db for animals with name like keyword and add to list 
    // hit db for animals with owner name like keyword and add to list 
    // hit db for animals with nick name like keyword and add to list 
    // remove duplicates in the list 
    return animals; 
} 

假設這種方法在相當多的地方使用,並假設它是一個長一點......現在好了,我想補充一個簡單的布爾是這樣的:

public List<Animal> findByKeyword(String keyword,boolean excludeDead){ 
     // code here... 
} 

唯一的區別應該是這樣的:

 // remove duplicates in the list 
    // if(excludeDead) removeDeadAnimalsFromTheList 

所以我不想複製粘貼整個方法。但是我不希望將參數添加到現有方法,因爲該方法在很多地方使用(其中excludeDead =默認情況下爲false ..假設這是一項新要求..)

但是,是的,我不想讓這種變化:

 // remove duplicates in the list 
    // if(excludeDead) removeDeadAnimalsFromTheList 

因爲我unneccesarily加載所有的動物屍體,如果exludeDead是真的。所以我想要做的就是修改:

// hit db for animals with name like keyword and add to list BASED ON THE GIVEN BOOLEAN VALUE 

什麼是擴展這段代碼的最佳方式?有什麼辦法讓參數可選?

請不要認爲這是一個真實的代碼,我只是試圖簡化它。

回答

1

超載的方法:

public List<Animal> findByKeyword(String keyword, boolean excludeDead) { 
    // the original code here 
    if (excludeDead) { 
     // additional code in case excludeDead is true 
    } 
} 

public List<Animal> findByKeyword(String keyword) { 
    return findByKeyword(keyword, false); 
} 
+0

這將是不明確的,不編譯 - 注意不是不同的參數 –

+0

@ user2310289:哦,忘記在第二種方法中刪除布爾參數。錯過了,對不起。現在編輯。 –

1

調用新實現中的第一個方法,然後將條件應用於結果列表。

public List<Animal> findByKeyword(String keyword, boolean excludeDead){ 
    List<Animal> list = findByKeyword(keyword); 

    // Now apply the condition on the list above. 
} 
+0

對不起,我完全讓我的問題錯了..我會編輯它。我想每次都用新參數打db,所以我不加載所有的死動物。 –

+0

編輯我的問題。抱歉,第一個版本不正確。我錯過了最重要的部分。 –

4

使用默認值

public List<Animal> findByKeyword(String keyword){ 
    return findByKeyword(keyword, false); //your default value 
} 

public List<Animal> findByKeyword(String keyword,boolean excludeDead){ 
     List<Animal> animals = new ArrayList<Animal>(); 
    // Validate keyword is not null etc.. 
    // hit db for animals with name like keyword and add to list 
    // hit db for animals with owner name like keyword and add to list 
    // hit db for animals with nick name like keyword and add to list 
    // remove duplicates in the list 
    return animals; 
} 
+0

這基本上是我會建議的。讓原始方法調用您的新方法。基本上,你會「Cut'n'Paste」比「Copy'n'Paste」好得多。 – Daniel

+0

這就是答案! –

0

調用從第一第二種方法,您應該創建一個新的方法

public List<Animal> findByKeyword(String keyword, boolean excludeDead){ 
    List<Animal> animals = new ArrayList<Animal>(); 
    // Validate keyword is not null etc.. 
    // hit db for animals with name like keyword and add to list 
    // hit db for animals with owner name like keyword and add to list 
    // hit db for animals with nick name like keyword and add to list 
    // remove duplicates in the list 
// remove duplicates in the list 
    // if(excludeDead) removeDeadAnimalsFromTheList 
    return animals; 
} 

並從您現有的會議中調用hod

public List<Animal> findByKeyword(String keyword) { 
    return findByKeyword(keyword,false); 
} 

希望這會有所幫助。