Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪种方法更适合验证输入?_Java_Oop_Design Patterns - Fatal编程技术网

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类。