0

MyCounterGroovyでは、次のコードが渡されるように、と呼ばれるActiveObjectインスタンスを実装する必要があります。

final MyCounter counter = new MyCounter()
counter.incrementBy 10
counter.incrementBy 20
counter.update 'Hello'
assert 35 == counter.value

私は以下にリストされた2つの実装を持ってきました-それらのどれも機能しません。

1.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.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を使用してください

4

2 に答える 2

2

OK、これが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)

上記のいずれかの情報については、関連するドキュメントを参照してください。

于 2012-11-28T19:07:32.730 に答える
1

getValue()はオブジェクトの保護されていない内部状態に直接接触し、incrementalBy()とupdate()はどちらもアクティブオブジェクトの内部アクターを使用してオブジェクトの状態を変更するため、最初の例には競合状態があります。

2番目の例では、非ブロッキングメソッドがPromiseのインスタンスを返すため、intなどの特定の戻りタイプを指定することはできません。

ブライアンの提案に沿って、getValue()メソッドに。で注釈を付けるだけ@ActiveMethod(blocking=true)です。これにより、特定の戻り型を指定できます。

@ActiveMethod(blocking=true)
int getValue() {...}
于 2012-11-29T07:07:28.367 に答える