我想检查方法的输入值,我不想写这样的代码:
void name(String name) {
if(name != null) {
//some action
} else {
//some another action
}
}
所以我可以使用装饰器模式或注释。
装饰者示例:
public interface User {
void name(String name);
}
public final class dbUser {
//ctor...
void name(String name) {
//jdbc call for update user name
}
}
public final class CheckedNullUser {
private final CheckedNullUser user;
public CheckedNullUser(User user) {
this.user = user;
}
void name(String name) {
String inputName = "Some default value";
if(name != null) {
inputName = name;
}
return user.name(inputName);
}
}
注释示例:
public interface User {
void name(@NotNull String name);
}
public final class dbUser {
//ctor...
void name(@NotNull String name) {
//jdbc call for update user name
}
}
哪种方法更好?存在更好的方法吗?
答案 0 :(得分:0)
哪一个更好?这取决于您的要求和您的应用程序的行为。
使用装饰器模式生成几个其他对象仅用于验证,因此垃圾收集器的工作量更多。 (如果你的应用程序生成了太多这些对象,你可能会开始看到"停止世界"垃圾收集器的执行,这将导致冻结。)
使用注释(Bean Validation - JSR 349)可以利用反射,因此如果您的应用程序具有接近实时的要求,这可能会减慢速度。
从那些2开始,我特别喜欢Annotations方法,因为代码变得更容易理解,并且更容易找到将在每个字段上执行的检查。
https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/index.html
现在关于其他方法,您可以创建一个标记接口,它只包含一个方法,如:
boolean validate() throws ValidationException
然后你的对象应该实现这个接口,在运行你的对象之前你调用validate方法来执行你想要的所有检查。
答案 1 :(得分:0)
@NotNull注释本身没有任何作用。这不是处理空检查的方法。这是一种制作文档的方式。此外,大多数IDE将通知您潜在的空指针错误。 当谈到空检查处理时,您应该看一下这个问题link。 谈到业务 - 逻辑相关的验证,我认为你最好先检查它。如果逻辑太复杂,您可以创建一些辅助服务来处理它。