我使用java8的最新项目,发现处理Collection类型非常方便,它给了我很大的惊喜。但突然觉得一些传统的语法是如此繁琐,例如我有一个名为BuyerOrderCountStats的Object,每次买家提交订单,都会增加他的订单数,
BuyerOrderCountStats bocs = ...;
bocs.setOrderCount(bocs.getOrderCount()+1);
java 8中是否有一些方便的方法可以解决这个问题?
答案 0 :(得分:6)
java-8中没有什么特别的东西可以帮助你解决问题。但是,您可以设计您的类(即使在Java 1.0中)以更好地适应业务逻辑。删除setOrderCount
方法并将其替换为addOrder()
:
class BuyerOrderCountStats {
private int orderCount;
public void addOrder() {
orderCount++;
}
}
在许多情况下,您可以创建更好的特定于业务逻辑的方法来修改对象状态,而不是普通的setter。
答案 1 :(得分:3)
Tagir Valeev’s answer指向正确的方向。只要存在要建模的业务逻辑,就应该避免使用public
getter和setter(尤其是setter),并尝试提供适当的业务逻辑特定更新操作。
但是,由于您一般性地询问了属性和Java 8功能,因此值得注意的是,如果您仍然希望(或需要)允许对属性进行外部更新操作,则有另一种选择:
class BuyerOrderCountStats {
private int orderCount;
// may still have getters and setters
public void updateOrderCount(IntUnaryOperator op) {
orderCount=op.applyAsInt(orderCount);
}
}
然后您可以更改属性,如:
BuyerOrderCountStats stats= …
stats.updateOrderCount(count -> count+1 );
您只需记住,您不能在此处使用postfix ++
,因为count++
仅修改lambda表达式的参数,但返回旧值。前缀增量(即++count
)在此处可用于评估结果,但参数的修改将毫无意义且具有误导性。因此,此处不要同时使用++
和+=
,请像上例中一样使用+
。这同样适用于其他运营商。
updateProperty
方法可以在进行更改之前验证结果是否在属性的合法范围内,就像setProperty
可以做的那样。 updateProperty
方法的一个优点是,如果需要它可以提供锁定以避免并发更新。这是一种get-modify-set往返无法提供的东西。