我需要(主要是出于测试目的)编写一个消费者,其目的是记住调用它的次数。但是,我做不到
int i = 0;
Consumer<Object> handler = o -> i++;
因为i
必须是最终的,我不能增加最终变量。我想我需要类似MutableInteger
类的东西。那么正确的计算方法是什么?编写我自己的新类或新方法只是为了正确的方法。
答案 0 :(得分:12)
使用AtomicInteger
使用CAS实现。
AtomicInteger
有一个incrementAndGet()
方法可用于此目的。
知道JDK中有更多Atomic*
个变体也很有用,因此如果AtomicLong
对您来说还不够Integer
。
答案 1 :(得分:3)
你永远不能那样做。即使匿名课程不起作用。你需要一些允许你保持状态的对象包装器,比如
class NumberOfInvocations {
private int i = 0;
public void increment(){
i +=1;
}
}
但你必须确保一切都是线程安全的,或者你可以按照Adam的建议使用AtomicInteger。
答案 2 :(得分:0)
出于测试目的(您知道访问是单线程的),一种快速而肮脏的解决方法是:
int[] i = new int[]{0};
Consumer<Object> handler = o -> i[0]++;