Как я могу избежать этого, если заявление - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть перечисление

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

    public  boolean isCar()
{
    ...
}

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

У меня есть 2 DAO CarDAO и PushBikeDAO, которые реализуют BaseDao

У меня есть управляемый компонент JSF, что-то вроде этого

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
    }
}

Я пытаюсь избавиться от этого if if, возможно, с помощью обобщений или любой правильной ОО-методики. может быть что-то вроде

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

где, если vehicle.getcode() возвращает строковое значение Car, у меня есть класс модели Car.

Просто громко подумать (действительно стучит соломкой :)).

Это ответ на этот вопрос mine

Ответы [ 4 ]

4 голосов
/ 08 сентября 2011

Добавьте в перечисление метод, который вызывает new и возвращает правильный dao.

3 голосов
/ 08 сентября 2011

Пусть каждая из констант enum определяет свои соответствующие классы 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();
}

Взгляните на шаблон фабричного метода и шаблон стратегии , если хотите узнать больше. Enums - мой предпочтительный способ использовать последнее.

2 голосов
/ 08 сентября 2011

Я бы использовал фабричный метод, вот так:

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();
    }
}
1 голос
/ 08 сентября 2011

Если вы не используете больше объектов 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();

Отражение не , которое медленное, чтобы не использовать здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...