如何确保参数是 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;
}
}
我正在创建一个 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;
}
}