2011-09-07 43 views
2

我有一個枚舉怎樣才能避免這種if語句

public enum Vehicle { 
    CAR("CAR", "Car"), PUSHBIKE("PUSHBIKE", "PuschBike"); 

    public boolean isCar() 
{ 
    ... 
} 

    public boolean isPushBike() 
{ 
    .... 
} 
} 

我有一個2 DAO CarDAOPushBikeDAO這是正在實施BaseDao

我有一個JSF託管bean的財產以後這樣

public class JsfManagedBean { 

    private Vehicle vehicle; 

    private BaseDAO baseDao; 

    public void Search() 
    { 
      //I need to get rid of this if statement 
     if (vehicle.isCar()) 
     { 
      baseDao = new CarDao; 
      baseDao.search(); 
     } 
     else if(vehicle.isPushBike()) 
     { 
      baseDao = new PushBike; 
      baseDao.search(); 
     } 
     //Please Note each type of search is very different call to an other party's Jar 
    } 
} 

我想擺脫這一點,如果聲明可能通過使用泛型或任何適當的OO技術 可能是像

baseDao = new baseDaoImpl<getClass(vehicle.getcode())> 

如果vehicle.getcode()返回字符串值汽車我有一個模型類汽車。

只是大聲思考(牢牢抓住吸管:))。

這是mine

+0

當你看到它來臨時穿過街道:-) – bmargulies

+0

這不能用依賴注入來完成嗎? – ysdx

回答

3

讓每一個枚舉常量的定義各自的DAO類:

public enum Vehicle { 
    CAR("CAR", "Car"){ 
    public BaseDAO getNewDAO(){ 
     return new CarDAO(); 
    } 
    }, 
    PUSHBIKE("PUSHBIKE", "PuschBike"){ 
    public BaseDAO getNewDAO() { 
     return new PushBikeDAO(); 
    } 
    }; 

    Vehicle(String a, String b){/* ... */} 
    //this forces every enum constant to implement a getNewDAO() method: 
    abstract BaseDAO getNewDAO(); 
} 

這樣,您就可以使用:

public void Search() { 
    baseDao = vehicle.getNewDAO(); 
    baseDao.search(); 
} 

看看的Factory method patternStrategy pattern如果你願意喜歡瞭解更多。枚舉是我使用後者的首選方法。

4

這個問題的offshot的方法添加到調用new,並返回正確的DAO枚舉。

+0

難道我只是在這種情況下將if語句從一個類別轉移到另一個類別嗎?任何代碼片段的可能性請 –

+0

這將是一個工廠和戰略模式imho的混合物。這是他們去這裏的方式。 – f1sh

+0

我對所有偉大的回覆和upvoting所有真正的好方法謙遜,但既然只能接受一個:)我會把它給@ f1sh –

2

我會用一個工廠方法,像這樣:

public class JsfManagedBean { 

    private static final Map<Vehicle,BaseDAO> daos; 
    static { 
     Map<Vehicle,BaseDAO> tmp = new HashMap<Vehicle,BaseDAO>(); 
     tmp.put(Vehicle.CAR,new CarDAO()); 
     tmp.put(Vehicle.BIKE,new BikeDAO()); 
     daos = Collections.unmodifiableMap(tmp); 
    } 
    public static getDao(Vehicle v) { 
     return daos.get(v); 
    } 

    private Vehicle vehicle; 

    private BaseDAO baseDao; 

    public void Search() 
    { 
      baseDao = getDao(vehicle); 
      baseDao.search(); 
    } 
} 
+0

這不會在每次調用「Search()」時創建DAO對象的新實例。 – f1sh

+1

@ f1sh不,它沒有。它說明了如果需要一個新的DAO對象可以運行的基本概念。就個人而言,我不希望每次都需要我創建一個新實例的DAO,但那只是我自己。我有一個數據庫,我不需要一個新的對象。DAO不應該有任何可以被多線程調用分離的狀態變量。 – corsiKa

+0

這確實是一個不錯的方法,我會記住。謝謝很多。 –

1

除非你有更多的用途DAO對象,你可以把這段代碼更短:

if (vehicle.isCar()) new CarDao().search(); 
else if(vehicle.isPushBike()) new PushbikeDao().search(); 

兩種選擇,我d留在if聲明。如果你有車真的很多變種,您可以使用通過枚舉值和存儲DAO類鍵控哈希表:

Map<Vehicle, Class> DAOClass = new HashMap<...>(); 
... 
DAOClass.get(vehicle).getConstructor().newInstance().search(); 

反思是不是慢勿在這裏使用。

相關問題