在 Groovy 中,我需要实现一个名为 ActiveObject 的实例MyCounter
,以便通过以下代码:
final MyCounter counter = new MyCounter()
counter.incrementBy 10
counter.incrementBy 20
counter.update 'Hello'
assert 35 == counter.value
我提供了下面列出的两种实现方式——它们都不起作用。
1.
@ActiveObject
class MyCounter
{
private int counter = 0
@ActiveMethod
def incrementBy(int value)
{
println "incrementBy $value"
counter += value;
}
@ActiveMethod
def update(String value)
{
println "update $value"
counter += value.size();
}
int getValue()
{
println "getValue"
return counter;
}
}
我想这不起作用,因为调用incrementBy
不会阻塞,例如 value 属性,因此实际上在 incrementBy 操作完成之前访问了 counter 变量。
2.
@ActiveObject
class MyCounter
{
private int counter = 0
@ActiveMethod
def incrementBy(int value)
{
println "incrementBy $value"
counter += value;
}
@ActiveMethod
def update(String value)
{
println "update $value"
counter += value.size();
}
@ActiveMethod
int value()
{
println "getValue"
return counter;
}
}
编译器告诉我:
非阻塞方法不能返回特定类型,使用 def 或 void 代替