0

オブジェクトをコピーする代わりに、Bindingオブジェクトがオブジェクトへの参照を格納する方法があるかどうか疑問に思っていますか?

Binding b = new Binding()
String test = "test"
b.setVariable("sth", test)
test = "blah"
GroovyShell gs = new GroovyShell(b)
gs.evaluate("print(sth)")

残念ながら、「テスト」を出力します。

Groovyでそれを行う方法はありますか?

編集:

私が挙げた例は間違っていて、あまりにも単純すぎました。

あるスレッドでオブジェクトをインスタンス化し、別のスレッドでスクリプトを実行するため、問題が発生すると思います。

class Test {


[...] // field declarations

    public Test(String name, String url, def params, String validateScript, String afterTestScript, GroovyShell shell) {

[...] //just assigning params to fields

        shell.setVariable("current", this)
    }


    void action() {


       response = "something"

    }

    void validate() {
        //shell.setVariable("current", this)
    }

    void afterTest() {
        if (afterTestScript) shell.evaluate(afterTestScript)
    }

}

actionしたがって、Testオブジェクトは1つのスレッドで作成され、Runnableオブジェクトへの参照として渡します。Runnableオブジェクトは、メソッドvalidateを呼び出しafterTestます。setVariableコンストラクターでの呼び出しをコメントアウトし、コメントを外すと、正常にvalidate機能します。

並行性の「問題」である可能性はありますか?afterTestScriptでは、応答文字列を出力したいだけです。

4

2 に答える 2

0

自分で新しいスレッドを作成するときにこれを取得していました。スレッドプールを使い始めると、問題は解決しました。

他の変更が原因である可能性は十分にありますが、これがグルーヴィーなシェルに干渉していることがわかった唯一の変更です。

最終的に、Groovyシェルを使用して文字列を評価するのをやめ、文字列をスクリプトに解析して実行し始めました。これはパフォーマンスの大幅な向上でした。

于 2012-02-16T16:07:27.680 に答える
0

問題の本質は、実際には、オブジェクト参照を設定した後に変更されるという事実によるものです。割り当てた後で変更する場合は、ラッパーオブジェクトが必要です。例:

String test = "test"
b.setVariable("sth", test)
test = "blah"
GroovyShell gs = new GroovyShell(b)

使用する

class MyWapper {
  public String myText
  public MyWrapper(String text){
   this.myText = text;
  }
}

MyWrapper test = new MyWrapper("test")
b.setVariable("sth", test)
test.myText = "blah"
GroovyShell gs = new GroovyShell(b)
于 2014-08-27T20:12:43.260 に答える