是否存在一些Java8方便的方式来加入对象的属性?

时间:2015-11-12 04:23:04

标签: java java-8 setter

我使用java8的最新项目,发现处理Collection类型非常方便,它给了我很大的惊喜。但突然觉得一些传统的语法是如此繁琐,例如我有一个名为BuyerOrderCountStats的Object,每次买家提交订单,都会增加他的订单数,

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

java 8中是否有一些方便的方法可以解决这个问题?

2 个答案:

答案 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往返无法提供的东西。