我有一个设计问题。
我有两个数据对象,它们是类 A 和类 B 的实例。
A 和 B 没有任何行为——它们是带有 getter 和 setter 的 java bean。
我有一个验证接口(interface)和它的 10 个实现,定义了不同的验证。
我想在我的属性文件中指定哪个验证适用于哪个类。
是这样的:
A 类 XYZValidation,ABCValidation
B 类:ABCValidation、PPPValidation 等
我如何编写我的验证类,以便它服务于 A 类或 B 类实例的对象,或者我将来可能想要添加的任何其他 C 类的实例?
interface Validation {
public boolean check(??);
}
> 只是想添加这一行来感谢所有回复这篇文章的人,并说我很喜欢在这个令人惊叹的网站上度过的时光。 Stackoverflow 棒极了!
最佳答案
您是否考虑过使用注解来标记要在您的 bean 中验证的字段?
如果您有 10 个不同的验证,您可以指定 10 个注释。然后使用注释标记字段:
@ValideStringIsCapitalCase
private String myString;
@ValidateIsNegative
private int myInt;
使用反射 API 遍历所有字段并查看它们是否被标记,如下所示:
public static <T> validateBean(T myBean) throws IllegalAccessException {
Field[] fields = myBean.getClass().getDeclaredFields();
// This does not take fields of superclass into account
if (fields != null) {
for (Field field : allFields) {
if (field.isAnnotationPresent(ValideStringIsCapitalCase.class)) {
field.setAccessible(true);
Object value = field.get(existingEntity);
// Validate
field.setAccessible(false);
}
}
}
}
一个选项是用您要使用的 validator 标记整个类。
编辑:记得包含注释:
@Retention(RetentionPolicy.RUNTIME)
用于您的注释界面。
EDIT2:请不要直接修改字段(如上例所示)。而是使用反射访问它们的 getter 和 setter。
关于java - 设计问题 - java - 最好的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/954675/