0

我有这个验证功能。它根据数据库验证登录表单。java是否测试表达式username.isEmpty()password.isEmpty()两次?前者在 if ((!username.isEmpty()) && (!password.isEmpty())),后者在

if(username.isEmpty())
    error.addError("username", "Username is mandatory.");
if(password.isEmpty())
    error.addError("password", "Password is mandatory.");

?

是否有任何内部机制可以“存储”第一个测试的结果,避免重做相同的测试?我想保持性能,同时,我必须填充错误 bean。如果我想放置更多带有更多检查的字段,并使用正则表达式(例如注册表单),该怎么办?那个功能还会好吗?我要遵循的基本原则是:仅当我通过所有测试时才将 true 分配给标志(或输入一段代码)。否则,它将为假(默认情况下)。反之亦然(默认情况下标志为真,可能变为假)。

如果听起来不好,请随时纠正我的英语。谢谢。

public boolean validate(FormBean bean, FormErrorBean error)
    {
        // the validation flag
        boolean valid = false;

        if (bean instanceof LoginFormBean)
        {
            // check not null
            if (!bean.isEmpty())
            {
                String username = ((LoginFormBean) bean).getUsername();
                String password = ((LoginFormBean) bean).getPassword();

                if ((!username.isEmpty()) && (!password.isEmpty()))
                {
                    // create the DAO
                    UserDao uDao = new UserDao();

                    // check the user
                    valid = uDao.checkUser((LoginFormBean) bean);

                    // set the validation status of the bean
                    ((LoginFormBean) bean).setValid(valid);

                    // add the error, if any
                    if (!valid)
                        error.addError("Either the username is not valid or the password is wrong.");
                }
                else
                {
                    if(username.isEmpty())
                        error.addError("username", "Username is mandatory.");
                    if(password.isEmpty())
                        error.addError("password", "Password is mandatory.");
                }
            }
            else
            {
                // add the empty error...
                error.addError("Both the username and password are missing.");
            }
        }
        return valid;
    }
4

2 回答 2

1

据我所知,测试表达式将运行两次。

如果您打算多次运行 username.isEmpty() 和 password.isEmpty(),您可以首先将它们存储为布尔值。从理论上讲,这可以为您节省少量开销。但是,鉴于您可能不需要多次获得该结果,因此任何性能提升都可以忽略不计。

如果您使用正则表达式添加更多独特的检查,我无法想象您需要重用他们的结果。我认为你的代码结构很好。

于 2013-03-29T09:45:09.027 回答
1

java 是否两次测试表达式 username.isEmpty() 和 password.isEmpty() ?

是的,如果您调用相同的方法 2 次。

是否有任何内部机制可以“存储”第一个测试的结果,避免重做相同的测试?

您可以尝试将结果存储到两个不同的布尔值(每个 1 位):

boolean isPasswordEmpty = password.isEmpty();
boolean isUsernameEmpty = username.isEmpty(); 

并将它们用于您的测试。

如果我想放置更多带有更多检查的字段,并使用正则表达式(例如注册表单),该怎么办?那个功能还会好吗?

如果您想推动自己前进,请尝试使用 Spring Web 或 Apache Struts 进行表单验证和身份验证方法。

我要遵循的基本原则是:仅当我通过所有测试时才将 true 分配给标志(或输入一段代码)。否则,它将为假(默认情况下)。反之亦然(默认情况下标志为真,可能变为假)。

我认为您的下一步将是:“该死的,我需要的不仅仅是一面旗帜。我需要用户 ID、姓名和姓氏......”。因此,请尝试使用一些模式(例如 DTO 来存储您需要的内容并通过应用程序级别传输数据)。

我想建议您注意您的代码:

if (!bean.isEmpty()), username.isEmpty() 等等

因为 NullPointerException 是可行的。在尝试访问它之前,您应该确保您的 Object 不为空。

希望有帮助,

再见

于 2013-03-29T09:46:03.473 回答