2013-03-16 348 views
2

如果我有一個水果列表,包含各種Fruit實現,如Apple,Banana等。該列表是必要的,因爲其他方法對列表中的所有水果執行一般操作。如何獲取列表中特定類型的所有對象?

如何從列表中獲取特定類型的所有對象?比如所有的蘋果?做instanceof/if-else檢查非常難看,特別是當有很多類不同時。

如何改進以下內容?

class Fruit; 
class Apple extends Fruit; 
class Banana extends Fruit; 

class FruitStore { 
    private List<Fruit> fruits; 

    public List<Apple> getApples() { 
     List<Apple> apples = new ArrayList<Apple>(); 

     for (Fruit fruit : fruits) { 
      if (fruit instanceof Apple) { 
       apples.add((Apple) fruit); 
      } 
     } 

     return apples; 
    } 
} 
+0

是不是'instanceof'是如何按類型告訴對象的顯而易見的方式?它工作,使用它。 – millimoose 2013-03-16 18:18:18

+0

或者,使用訪問者模式或其他多態性應用程序來避免必須首先過濾列表。 – millimoose 2013-03-16 18:18:48

+0

另外,你可以使用'HashMap'作爲'水果類型名稱'的鍵值和作爲'水果'對象的'ArrayList'值 – 2013-03-16 18:20:37

回答

1

你應該知道 - 的代碼是不好的做法的實例。

怎樣編寫.getType(),返回枚舉類型的對象?

+0

這可能比做所有getclass,instanceof的東西更好。 – membersound 2013-03-16 18:50:10

0

您使該方法一般:

public <T extends Fruit> List<T> getFruitsByType(Class<T> fType) { 
    List<T> list = new ArrayList<T>(); 
    for (Fruit fruit : fruits) { 
     if (fruit.getClass() == fType) { 
      list.add(fType.cast(fruit)); 
     } 
    } 
    return list; 
} 

而且使用它,如下所示:

FruitStore fs = new FruitStore(); 
List<Apple> apples = fs.getFruitsByType(Apple.class); 
相關問題