Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否存在一些Java8方便的方式来增加对象的属性?_Java_Java 8_Setter - Fatal编程技术网

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

是否存在一些Java8方便的方式来增加对象的属性?,java,java-8,setter,Java,Java 8,Setter,我使用java8的最新项目,发现处理集合类型非常方便,这给了我很大的惊喜。但是突然觉得一些传统的语法太麻烦了,比如我有一个叫做BuyerOrderCountStats的对象,每次买家提交订单,都会增加订单数量 BuyerOrderCountStats bocs = ...; bocs.setOrderCount(bocs.getOrderCount()+1); 在java 8中是否有一些我不知道的方便的方式来解决这种情况?java-8中没有什么特别的东西可以帮助解决您的问题。但是,您可以设计类

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

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

在java 8中是否有一些我不知道的方便的方式来解决这种情况?

java-8中没有什么特别的东西可以帮助解决您的问题。但是,您可以设计类(即使在Java1.0中)以更好地适应业务逻辑。删除
setOrderCount
方法并将其替换为
addOrder()

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

为您指明了正确的方向。无论何时有业务逻辑要建模,都应该避免使用
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
方法的一个优点是,如果需要避免并发更新,它可以提供锁定。这是“获取-修改集”往返无法提供的功能。

谢谢!如果使用普通的getter/setter并保证线程安全,则应使用同步装饰。你的意思是只使用updateProperty不需要同步,但仍然可以保证线程安全?不,关键是,使用线程安全的getter和setter不会阻止getter和setter调用之间的更新。因此,使用通过getter读取的旧值和通过setter写入计算值的更新仍然需要额外的外部锁定操作,即使这两个方法本身是线程安全的。相反,update方法可以是线程安全的,在lambda表达式的整个计算过程中保持锁。如果需要,它仍然必须这样做,例如通过声明方法
synchronized
。但不需要在调用方进行外部同步。
BuyerOrderCountStats stats= …
stats.updateOrderCount(count -> count+1 );