确实存在一些Java8方便的方式来增加对象的属性



最近的项目我使用了java8,发现处理Collection类型非常方便,这给了我很大的惊喜。但突然觉得一些传统语法太麻烦了,比如我有一个名为BuyerOrderCountStats的对象,每次买家提交订单时,都会增加他的订单数量,

BuyerOrderCountStats bocs = ...;
bocs.setOrderCount(bocs.getOrderCount()+1);

对于我不知道的java8中的这种情况,有什么方便的方法吗?

java-8中没有任何特别的东西可以帮助解决您的问题。然而,您可以设计您的类(甚至在Java 1.0中)来更好地适应业务逻辑。删除setOrderCount方法并将其替换为addOrder():

class BuyerOrderCountStats {
    private int orderCount;
    public void addOrder() {
        orderCount++;
    }
}

在许多情况下,您可以创建更好的业务逻辑特定方法来修改对象状态,而不是简单的setter。

Tagir Valeev的回答为您指明了正确的方向。只要有业务逻辑需要建模,就应该避免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 );

您只需要记住,不能在这里使用后缀++,因为count++只修改lambda表达式的参数,但返回旧值。前缀增量,即++count,在评估结果时会起作用,但参数的修改将毫无意义且具有误导性。因此,这里既不用++也不用+=,像上面的例子一样总是用+。这同样适用于其他运营商。

updateProperty方法可以像setProperty一样,在进行更改之前验证结果是否在属性的合法范围内。updateProperty方法的一个优点是,如果需要,它可以提供锁定,以避免并发更新。这是get-modify-set-roundtrip无法提供的。

最新更新