在Groovy中,我需要实现一个名为MyCounter
的ActiveObject实例,以便以下代码通过:
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操作完成之前访问的。
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
答案 0 :(得分:2)
好的,根据假设这是GPars,你应该可以使用以下代码来使用你的第一个实现:
final MyCounter counter = new MyCounter()
def x1 = counter.incrementBy 10
def x2 = counter.incrementBy 20
def x3 = counter.update 'Hello'
x1.get() //block
x2.get() //block
x3.get() //block
assert 35 == counter.value
您可能需要提供更多信息,以确定您在执行流程方面的具体目标,以获得更好的信息。
您还可以更改注释以指示阻止:
@ActiveMethod(blocking=true)
有关上述任何内容的信息,请参阅相关docs。
答案 1 :(得分:1)
第一个例子有一个竞争条件,因为getValue()直接触及对象的不受保护的内部状态,而incrementBy()和update()都使用活动对象的内部actor来修改对象的状态。
在第二个示例中,由于非阻塞方法返回Promise的实例,因此不允许提供特定的返回类型,例如int。
与Brian建议的内容一致,只需使用@ActiveMethod(blocking=true)
注释getValue()方法,这将允许您提供特定的返回类型。
@ActiveMethod(blocking=true)
int getValue() {...}