如何确保参数是类字段(Java)?

时间:2015-07-23 00:58:22

标签: java enums arguments

我正在创建一个返回Cars列表的API。 API用户必须能够请求筛选列表并按Cars类的特定属性(字段)进行排序。我怎么能这样做?

class Car {
  public final String model;
  public final String color;

  public Car(String m, String c) {
    model = m;
    color = c;
  }
}

class CarListRequest {
  public final String sortBy;
  public final String filterBy;
  public final List<String> filterList;

  public CarListRequest(String s, String f, List<String> list) {
    sortBy = s;
    filterBy = f;
    filterList = list;
  }
}

有没有办法使用Java语言功能限制sortBy和filterBy字符串不能包含除Car类的属性(字段)之外的任何其他值?

我知道我可以使用枚举来声明Car的所有属性,但这会导致我想避免的字符串重复。

2 个答案:

答案 0 :(得分:3)

@hmc_jake的反思建议非常有效。但是,如果要避免反射,可以使用类层次结构来执行此操作:

class CarAttribute {
    private String attrib;
    public CarAttribute(String att){
        attrib = att;
    }
    // add getters and/or setters for attrib ... 
}

class CarModel extends CarAttribute {
}

class CarColor extends CarAttribute {
}

class Car {
    public final CarModel model;
    public final CarColor color;

    public Car(CarModel m, CarColor c) {
        model = m;
        color = c;
    }
}

class CarListRequest {
    public final CarAttribute sortBy;
    public final CarAttribute filterBy;
    public final List<CarAttribute> filterList;

    public CarListRequest(CarAttribute s, CarAttribute f, List<CarAttribute> list) {
        sortBy = s;
        filterBy = f;
        filterList = list;
    }
 }

答案 1 :(得分:1)

在Java中使用Reflection,可以检查类的字段。

例如,当传入s时,您可以像这样检查参数:

for (Field field : Car.class.getFields()) {
    if (field.getName().equalsIgnoreCase(s)) {
        Do something here to signal that s
        was a valid Field of the Car class.
    }
}

这样做可以反射检查Car类,以验证传入的参数实际上是该类的字段。

但请注意,如果可能的话,你应该使用枚举或类层次结构,因为对于你想要完成的事情,反射可能有点过分。