Java 良好实践:valid属性与isValid()方法?
哪种检查being有效性的方法更好?第一个: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.
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()方法。这是好的,因为我不会打破这个豆样的模式。接受者和接受者背后不应该有逻辑
不过我会再吃一次冰毒