哪种方法更适合验证输入?

时间:2017-02-28 12:35:43

标签: 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 {
    //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
    }

}

哪种方法更好?存在更好的方法吗?

2 个答案:

答案 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。 谈到业务 - 逻辑相关的验证,我认为你最好先检查它。如果逻辑太复杂,您可以创建一些辅助服务来处理它。