Java 良好实践:valid属性与isValid()方法?

Java 良好实践:valid属性与isValid()方法?,java,validation,Java,Validation,哪种检查being有效性的方法更好?第一个: public class Order { ... private boolean valid; public boolean isValid() { return valid; } public boolean setValid(boolean valid) { this.valid = valid; } // getters, setters, etc.

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

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.
}
我们没有保留在DB中的
有效
值,但每次需要时都会按需计算


哪种方法更好?

第一种结构与
setValid
方法是丑陋的。我无法想象
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是一个常量),则可以使用此变量。

在其他情况下,第二种变体更好。

带有
setValid
方法的第一个结构很难看。我无法想象
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是一个常量),则可以使用此变量。

在其他情况下,第二种变体更好。

带有
setValid
方法的第一个结构很难看。我无法想象
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是一个常量),则可以使用此变量。

在其他情况下,第二种变体更好。

带有
setValid
方法的第一个结构很难看。我无法想象
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是一个常量),则可以使用此变量。

在其他情况下,第二种变体更好。

没有确切的答案。这要看情况而定。取决于您的课程设计和业务规则

例如,如果订单的
valid
状态仅检查简单的规则,如检查对象引用的当前状态,则将其作为带有主体的方法

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

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

没有确切的答案。这要看情况而定。取决于您的课程设计和业务规则

例如,如果订单的
valid
状态仅检查简单的规则,如检查对象引用的当前状态,则将其作为带有主体的方法

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

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

没有确切的答案。这要看情况而定。取决于您的课程设计和业务规则

例如,如果订单的
valid
状态仅检查简单的规则,如检查对象引用的当前状态,则将其作为带有主体的方法

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

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

没有确切的答案。这要看情况而定。取决于您的课程设计和业务规则

例如,如果订单的
valid
状态仅检查简单的规则,如检查对象引用的当前状态,则将其作为带有主体的方法

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

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

在第一个示例中,您将“valid”视为POJO字段,即与getter()setter()方法类似,只是因为它是布尔值,所以它是isser()方法。这是好的,因为我不会打破这个豆样的模式。接受者和接受者背后不应该有逻辑

不过我会再吃一次冰毒