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

How can I ensure an argument is a class field (Java)?

我正在创建一个 API returns 汽车列表。 API 用户必须能够请求按 Cars class 的特定属性(字段)对列表进行过滤和排序。我该怎么做?

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 class 的属性(字段)以外的任何其他值?

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

在 Java 中使用反射,可以检查 class 的字段。

例如,当传入 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 class 以验证传入的参数实际上是 class.

的一个字段

但是请注意,如果可能的话,您应该使用枚举或 class 层次结构,因为反射对于您要完成的目标来说可能有点矫枉过正。

@hmc_jake 的反映建议很有道理。但是,如果您想避免反射,可以使用 class 层次结构来实现:

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