Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何避免这个if语句_Java_Oop_Design Patterns_Generics_If Statement - Fatal编程技术网

Java 我如何避免这个if语句

Java 我如何避免这个if语句,java,oop,design-patterns,generics,if-statement,Java,Oop,Design Patterns,Generics,If Statement,我有一个枚举 public enum Vehicle { CAR("CAR", "Car"), PUSHBIKE("PUSHBIKE", "PuschBike"); public boolean isCar() { ... } public boolean isPushBike() { .... } } 我有一个2 DAOCarDAO和PushBikeDAO正在实现一个BaseDao 我有一个JSF管理的bean public class Jsf

我有一个枚举

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())> 
baseDao=newbasedaoimpl
其中,如果
vehicle.getcode()
返回字符串值Car,则我确实有一辆模型类汽车

只是大声地思考(真的是紧握着吸管:))


这是这个问题的一个分支,即在枚举中添加一个调用new并返回正确dao的方法。

我将使用工厂方法,如下所示:

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();
    }
}
公共类JsfManagedBean{
私有静态最终映射daos;
静止的{
Map tmp=newhashmap();
tmp.put(车辆、汽车、新卡道());
tmp.put(车辆、自行车、新自行车);
daos=集合。不可修改映射(tmp);
}
公共静态getDao(车辆v){
返回daos.get(v);
}
私家车;
私人BaseDAO BaseDAO;
公开无效搜索()
{
baseDao=getDao(车辆);
baseDao.search();
}
}

除非对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();
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();
}
Map DAOClass=newhashmap();
...
DAOClass.get(vehicle.getConstructor().newInstance().search();

这里不使用反射并不慢。

让每个枚举常量定义各自的DAO类:

Map<Vehicle, Class> DAOClass = new HashMap<...>();
...
DAOClass.get(vehicle).getConstructor().newInstance().search();
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();
}

如果您想了解更多,请查看和。Enum是我使用后者的首选方式。

当你看到它即将出现时,请过街:-)这难道不能用依赖项注入来完成吗?在这种情况下,我会将if语句从一个类转移到另一个类吗?任何可能的代码片段都可以,这将是工厂模式和策略模式的混合体。这就是他们的方式。我对所有的优秀回复和所有非常好的方法都感到谦卑,但因为我只能接受一种:)我会把它给@f1shf1sh,因为它比我更需要这个代表。这不会在每次调用
Search()
@f1sh时创建DAO对象的新实例不,不会。它说明了在需要新DAO对象时可以使用的基本概念。就我个人而言,我不希望DAO每次都要求我创建一个新实例,但那只是我自己。我只有一个数据库,不需要新对象。DAO不应该有任何状态变量会被多线程调用破坏。这确实是一种很好的方法,我会记住。非常感谢。