好的做法:有效的属性与isValid()方法?

时间:2014-10-22 14:41:23

标签: java validation

哪种检查有效的方法更好?第一个:

public class Order {
    ...
    private boolean valid;

    public boolean isValid() {
        return valid;
    }

    public boolean setValid(boolean valid) {
        this.valid = valid;
    }

    // getters, setters, etc.
}

其中valid在DB中保持为布尔值,并由Java代码在其他地方设置,例如在DAO。

或者第二个:

public class Order {
    ...


    public boolean isValid() {
        // some business code, e.g.:
        return !orderItems.isEmpty();
    }


    // getters, setters, etc.
}

我们没有valid值保留在数据库中,但每次需要它时都会按需计算。

哪种方法更好?

3 个答案:

答案 0 :(得分:1)

没有确切的答案。这取决于。取决于您的课程设计和业务的业务规则。

例如,如果订单的valid状态仅检查一个简单的规则,例如检查对象引用的当前状态,那么将其作为具有正文的方法。

public class Order {
    public boolean isValid() {
        //validate current state of object reference
        //re using your same example
        return !orderDetail.isEmpty();
    }
}

但是如果您有一个业务规则要求订单在将其发送到客户端之前应该通过验证过程,并且应该在应用程序的任何时刻知道此状态(以及正确的描述),那么数据库中的valid字段是解决它的一种方法。事实上,如果是这种情况,最好将valid字段存储为VARCHAR(X),并使用enum OrderStatus限制此字段的值。但话又说回来,这取决于你班级的设计。

答案 1 :(得分:1)

在第一个例子中,您正在对待有效的'作为POJO字段,即就像 getter() setter()方法一样,除非因为它是布尔值,所以它是 isser()方法。这没关系,因为我不会打破这种类似bean的模式。吸气剂和制定者应该没有任何逻辑。

Insetad我会有另一种方法 validate(),它可以解决这些问题。

validate()执行验证并设置有效变量。 isValid()返回上次执行的验证。

我经常看到的反模式是一个 getXXXXX()方法,需要大约30秒才能完成,因为它正在执行计算和数据库命中,这会让用户认为是这个类的用户感到困惑正常的POJO类中的正常吸气剂。

答案 2 :(得分:0)

使用setValid方法的Fisrt结构很难看。我无法想象使用setValid方法 如果要使用单独的属性,更好的方法是使用延迟初始化:

public class Order 
{
    ...
    private Boolean valid;

    public boolean isValid() 
    {
        if (valid == null)
        {
           valid = !orderItems.isEmpty();
        }
        // some business code, e.g.:
        return valid;
    }
}  

如果isValid方法包含硬逻辑并且您的类是不可变的 orderItems 是常量),那么您可以使用此变体。
在其他情况下,第二种变体更好。