我应该避免使用注释吗?
Should I avoid using annotations?
在我的项目中,我从 json 文件(使用 gson)加载配置,您可能知道,缺少的字段将用空字符串填充。
有些字段是必填字段,其他字段必须大于 X,我想验证它。
简单(和丑陋)的方法是对每个 属性 使用 if 条件,例如:
if (StringUtils.isEmpty(sftpConfiguration.getHostName)) {
logger.error (“hostName property is mandatory”);
// etc.
}
但是,我的字段不止一个,以后会添加越来越多的属性,所以我建了两个注解,分别叫NorNullEmpty
和GreaterThen
(取值为属性 ) 并且我 运行 像这样抛出字段:
public static boolean validateWithAnnotation(Object object) throws IllegalAccessException {
boolean result = true;
Field[] classFields = object.getClass().getDeclaredFields();
for (Field field : classFields) {
if (field.getAnnotation(NorNullEmpty.class) != null) {
if (field.getType() == String.class) {
field.setAccessible(true);
String value = (String) field.get(object);
if (StringUtils.isEmpty(value)) {
result = false;
logger.error("Property {} is mandatory but null or an empty.", field.getName());
}
field.setAccessible(false);
} else {
logger.warn("@NorNullEmpty annotation is working on String type only.");
}
} else if (field.getAnnotation(GreaterThan.class) != null) {
Class<?> fieldType = field.getType();
if (fieldType == long.class || fieldType == Long.class) {
field.setAccessible(true);
Long val = field.getLong(object);
if (val <= field.getAnnotation(GreaterThan.class).value()) {
result = false;
logger.error("Property {} value is {} and it must be greater than {}.", field.getName(), val, field.getAnnotation(GreaterThan.class).value());
}
field.setAccessible(false);
}
}
}
return result;
}
当我用拼贴画进行代码审查时,他非常害怕注释的使用,“这是非常冒险且成本非常高的”..
很高兴知道您的想法,我是否应该为每个字段使用简单愚蠢的 if?继续反思?或者我应该使用其他方式验证字段?
注意:不使用 Spring / 休眠。
首先,您正在尝试重新发明轮子。
有一个名为 Hibernate Validator 的项目,它是 bean 验证参考规范的实现。
这是他们的着陆页示例:
public class Car {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 2, max = 14)
private String licensePlate;
@Min(2)
private int seatCount;
// ...
}
因此您定义了验证和 运行 引擎,它将执行所有检查和 return 错误(如果有的话)。您甚至可以滚动自己的验证,使其具有可扩展性。
附带说明 - 该项目与 Hibernate(java 世界中众所周知的 ORM 映射工具)没有任何共同之处。
如果您需要类似的东西,该项目还与 spring MVC 集成。
无论如何,它确实使用了注释方法并且确实有一些性能损失。但是这完全取决于你有什么样的数据,例如它仍然比做网络调用快得多,所以如果你的项目做这样的事情,可能额外的成本可以忽略不计。
反射不像在第一个 Java 版本中那么慢,但底线是您应该自己尝试看看它是否符合您的需求。否则我只能推测。
Here你可以找到关于这个主题的教程,应该是相关的
在我的项目中,我从 json 文件(使用 gson)加载配置,您可能知道,缺少的字段将用空字符串填充。
有些字段是必填字段,其他字段必须大于 X,我想验证它。
简单(和丑陋)的方法是对每个 属性 使用 if 条件,例如:
if (StringUtils.isEmpty(sftpConfiguration.getHostName)) {
logger.error (“hostName property is mandatory”);
// etc.
}
但是,我的字段不止一个,以后会添加越来越多的属性,所以我建了两个注解,分别叫NorNullEmpty
和GreaterThen
(取值为属性 ) 并且我 运行 像这样抛出字段:
public static boolean validateWithAnnotation(Object object) throws IllegalAccessException {
boolean result = true;
Field[] classFields = object.getClass().getDeclaredFields();
for (Field field : classFields) {
if (field.getAnnotation(NorNullEmpty.class) != null) {
if (field.getType() == String.class) {
field.setAccessible(true);
String value = (String) field.get(object);
if (StringUtils.isEmpty(value)) {
result = false;
logger.error("Property {} is mandatory but null or an empty.", field.getName());
}
field.setAccessible(false);
} else {
logger.warn("@NorNullEmpty annotation is working on String type only.");
}
} else if (field.getAnnotation(GreaterThan.class) != null) {
Class<?> fieldType = field.getType();
if (fieldType == long.class || fieldType == Long.class) {
field.setAccessible(true);
Long val = field.getLong(object);
if (val <= field.getAnnotation(GreaterThan.class).value()) {
result = false;
logger.error("Property {} value is {} and it must be greater than {}.", field.getName(), val, field.getAnnotation(GreaterThan.class).value());
}
field.setAccessible(false);
}
}
}
return result;
}
当我用拼贴画进行代码审查时,他非常害怕注释的使用,“这是非常冒险且成本非常高的”..
很高兴知道您的想法,我是否应该为每个字段使用简单愚蠢的 if?继续反思?或者我应该使用其他方式验证字段?
注意:不使用 Spring / 休眠。
首先,您正在尝试重新发明轮子。 有一个名为 Hibernate Validator 的项目,它是 bean 验证参考规范的实现。
这是他们的着陆页示例:
public class Car {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 2, max = 14)
private String licensePlate;
@Min(2)
private int seatCount;
// ...
}
因此您定义了验证和 运行 引擎,它将执行所有检查和 return 错误(如果有的话)。您甚至可以滚动自己的验证,使其具有可扩展性。
附带说明 - 该项目与 Hibernate(java 世界中众所周知的 ORM 映射工具)没有任何共同之处。
如果您需要类似的东西,该项目还与 spring MVC 集成。
无论如何,它确实使用了注释方法并且确实有一些性能损失。但是这完全取决于你有什么样的数据,例如它仍然比做网络调用快得多,所以如果你的项目做这样的事情,可能额外的成本可以忽略不计。
反射不像在第一个 Java 版本中那么慢,但底线是您应该自己尝试看看它是否符合您的需求。否则我只能推测。
Here你可以找到关于这个主题的教程,应该是相关的