我有一个枚举
public enum Vehicle {
CAR("CAR", "Car"), PUSHBIKE("PUSHBIKE", "PuschBike");
public boolean isCar()
{
...
}
public boolean isPushBike()
{
....
}
}
我有一个2 DAO CarDAO
和PushBikeDAO
正在实施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技术来摆脱这个if语句 可能就像
baseDao = new baseDaoImpl<getClass(vehicle.getcode())>
如果vehicle.getcode()
返回String值Car我有一个模型类Car。
只是大声思考(真的抓住吸管:))。
这是mine
这个问题的一个结果答案 0 :(得分:4)
向枚举中添加一个方法,该方法调用new并返回正确的dao。
答案 1 :(得分: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 pattern和Strategy pattern。枚举是我使用后者的首选方式。
答案 2 :(得分: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();
}
}
答案 3 :(得分:1)
除非您对DAO对象有更多用途,否则可以缩短此代码:
if (vehicle.isCar()) new CarDao().search();
else if(vehicle.isPushBike()) new PushbikeDao().search();
有两种选择,我会留下if
声明。如果您有很多车型,您可以使用由枚举值键入的哈希表并存储DAO类:
Map<Vehicle, Class> DAOClass = new HashMap<...>();
...
DAOClass.get(vehicle).getConstructor().newInstance().search();
反射不是 在此处不使用。