我试图测试通过听众提供的double
是否随每次通话单调增加。
为此,我要保留另一个double
进行比较,并在监听器lambda的末尾更新它:
double lastProgress = 0;
operator.addProgressListener(progress -> {
assertThat(progress, greaterThanOrEqualTo(lastProgress));
lastProgress = progress;
});
然而,这自然会导致编译错误(Local variable lastProgress defined in an enclosing scope must be final or effectively final
),因为lastProgress
正在被更改。
对于long
变量,解决方法是使用AtomicLong
的最终实例,并相应地设置其值。对于double
s,其值可以按照here所述映射到long
,从而生成以下代码:
AtomicLong lastProgress = new AtomicLong(Double.doubleToLongBits(0));
operator.addProgressListener(progress -> {
assertThat(progress, greaterThanOrEqualTo(Double.longBitsToDouble(lastProgress.get())));
lastProgress.set(Double.doubleToLongBits(progress));
});
即使这样有效,但要理解正在发生的事情还是非常不方便而且并不容易。
由于Java没有像AtomicDouble
这样的内置类,是否有一种方便的方法来获取代表double
的可变最终对象?