Java 哪种方法更适合验证输入?
我想检查方法的输入值,但我不想编写这样的代码:Java 哪种方法更适合验证输入?,java,oop,design-patterns,Java,Oop,Design Patterns,我想检查方法的输入值,但我不想编写这样的代码: void name(String name) { if(name != null) { //some action } else { //some another action } } 所以我可以使用装饰图案或注释 装饰器示例: public interface User { void name(String name); } public final class dbUser
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
}
}
哪种方法更好?存在更好的方法吗?哪种方法更好?这将取决于您的需求和应用程序的行为 使用decorator模式生成其他几个对象只是为了验证,因此垃圾收集器需要做更多的工作。(如果您的应用程序生成的对象太多,您可能会看到“停止世界”垃圾收集器的执行,这将导致冻结) 使用注释(BeanValidation-JSR349)可以利用反射,所以如果您的应用程序有近实时的需求,这可能会降低速度 从这两个方面来看,我特别喜欢注释方法,因为代码更容易理解,也更容易找到将在每个字段上执行的检查 现在,关于其他方法,您可以创建一个只包含一个方法的标记接口,如:
boolean validate()抛出ValidationException
然后你的对象应该实现这个接口,在运行你的对象之前,你调用validate方法来执行你想要的所有检查。@NotNull注释本身什么都不做。这不是处理空检查的方法。这是一种制作文档的方式。此外,大多数IDE都会通知您潜在的空指针错误。 当谈到空检查处理时,您应该看看这个问题。
当涉及到与业务逻辑相关的验证时,我认为您最好首先检查它。如果逻辑太复杂,您可以创建一些辅助服务来处理它。如何使用Objects.requirennull(name)作为dbUser.name方法中的第一条语句?@RomcoBomco您的Decorator示例不是Decorator示例,而是简单委托的示例。您显示了一个名为
dbUser
的类,但从未在代码中使用它。如果没有缺少的组件,您的伪代码就没有意义。@ckk我的代码应该看起来像new CheckedNullUser(new dbUser(//ctor args)).name(“ckk”);所以CheckedNullUser类修饰dbUser类。