我正在创建一个返回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的所有属性,但这会导致我想避免的字符串重复。
答案 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类,以验证传入的参数实际上是该类的字段。
但请注意,如果可能的话,你应该使用枚举或类层次结构,因为对于你想要完成的事情,反射可能有点过分。