我怎么能避免这个if语句

时间:2011-09-07 22:14:05

标签: java oop design-patterns generics if-statement

我有一个枚举

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技术来摆脱这个if语句 可能就像

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

如果vehicle.getcode()返回String值Car我有一个模型类Car。

只是大声思考(真的抓住吸管:))。

这是mine

这个问题的一个结果

4 个答案:

答案 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 patternStrategy 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();

反射不是 在此处不使用。