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