我目前正在接受培训,我被分配编写代码,使用java
使用hibernate和sql DB
来维护和保存对象。
我观察到在许多情况下我必须使用具有持久化实体的硬编码变量名的switch语句,我发现这个解决方案很难维护而且不灵活(我的所有可能的Vehicle类变量至少有4个不同类)。
我已经向我的导师建议,也许解决方案是拥有可能的变量名称的最终数组并将其用于迭代,但是我被告知这个解决方案很糟糕(没有进一步的解释)。
我试图为我的问题找到很好的例子,但我失败了。
我的问题是,在查询,实体更新等情况下处理变量的最佳解决方案是什么?
修改
根据要求,我提供了我遇到问题的代码示例。这是我的Query
类
public class VehicleQueryCriteria extends QueryCriteria<DBVehicle> {
private Object[] argumentValue = new Object[1];
private String[] argumentName = new String[1];
private CompareEnum[] relation = new CompareEnum[1];
public VehicleQueryCriteria(String argumentName, CompareEnum relation, Object argumentValue){
this.argumentValue[0] = argumentValue;
this.relation[0] = relation;
this.argumentName[0] = argumentName;
}
@Override
public Object[] getValues() {
return this.argumentValue;
}
@Override
public String[] getValueName() {
return this.argumentName;
}
@Override
public CompareEnum[] getRelations() {
return this.relation;
}
}
在抽象超类中再添加一个方法
public void accept(QueryVisitor<T> queryVisitor) {queryVisitor.visitQuery(this);}
其中查询访问者使用以下方法创建验证器对象
private static Validator<DBVehicle> parse(String argumentName, Object argumentValue, CompareEnum relation){
switch (argumentName){
case "id":
return VehicleValidator.create(relation, (UUID)argumentValue, DBVehicle::getId);
case "vinNumber":
return VehicleValidator.create(relation, (String)argumentValue, DBVehicle::getVinNumber);
case "productionDate":
return VehicleValidator.create(relation, (Date)argumentValue, DBVehicle::getProductionDate);
case "plateNumber":
return VehicleValidator.create(relation, (String)argumentValue, DBVehicle::getPlateNumber);
case "manufacturer":
return VehicleValidator.create(relation, (String)argumentValue, DBVehicle::getManufacturer);
case "horsePower":
return VehicleValidator.create(relation, (Integer)argumentValue, DBTruck::getHorsePower);
case "mileage":
return VehicleValidator.create(relation, (Integer)argumentValue, DBTruck::getMileage);
case "volume":
return VehicleValidator.create(relation, (Integer)argumentValue, DBTrailer::getVolume);
default:
throw new IllegalArgumentException("Parameter name \"" + argumentName+ "\" is not valid Vehicle parameter");
}
}
CompareEnum
是包含GREATER_THAN
和EQUALS
和Validator
等一组比较符的枚举,其中一个方法方法validate
接受&#34; BDVehicle& #34;并返回布尔值。 Query
和Validator
都是可扩展的,可以在复合类中轻松聚合,我对此解决方案非常满意。唯一困扰我的是这个switch语句。