0

Processing の PApplet クラスを使用するプログラムを Java で作成しました。このクラスは、バックグラウンドで PApplet オブジェクトをインスタンス化します。他のいくつかのクラスでこのオブジェクトへの参照が必要だったので、次の小さなトリックを使用しました。

public class MyApplet extends PApplet {
  public static MyApplet myApplet;
  // plus other various fields...

  // initializing block
  {
    myApplet = this;
  }

  // stuff...
}

// Now in some other class
import static MyApplet.myApplet;
class OtherClass {
  // here I can use the reference to myapplet
  myApplet.whatever();
}

すべてが素晴らしくクールに機能しました。しかし、このコードをすべて Groovy に変換したいと考えました。問題は、Groovy のクロージャーが変数の「スナップショット」を宣言時に非常に早い段階で取得することです。そのため、myappletフィールドが初期化されていないと見なされます。Groovy は初期化ブロックよりも早い段階で処理を行います。少なくともmyapplet、Groovy クラスで が null と見なされる理由についての私の説明です。

どうすればこれを回避できますか? PAppletバックグラウンドで構築されているアプレット オブジェクトへの参照を取得するにはどうすればよいですか?

4

3 に答える 3

0

@Lazy注釈はそれを回避しますか?すなわち:

public class MyApplet extends PApplet {
  @Lazy static MyApplet instance = { -> MyApplet._instance }()
  private static _instance 
  public MyApplet() {
    MyApplet._instance = this
  }
}

その後、電話MyApplet.instance

この静的インスタンスのアプローチはかなり脆弱であり、アプレットインスタンスを他のクラスに明示的に渡すことを検討するか、静的グローバルインスタンスルートを使用する代わりに他のメソッドを使用することをお勧めします。

于 2012-09-24T00:05:51.573 に答える
0

PAppletインスタンスへの参照をインスタンスに渡さないのはなぜOtherClassですか?

public class MyApplet extends PApplet {
    void setup () {
        OtherClass otherClassInstance = new OtherClass(this);
    }
}

class OtherClass {
    public OtherClass (PApplet p) {
        //p.whatever();
    }
}

のコンストラクタより後に PApplet のフィールド/メソッドにアクセスする必要がある場合はOtherClass、その参照をローカル メンバに保存します。

class OtherClass {
    private PApplet p;
    public OtherClass (PApplet p) {
        this.p = p;
    }

    private void someMethod () {
        //p.whatever();
    }
}

これは、Java 内で Processing を使用する通常の方法です。

于 2012-09-24T05:49:06.607 に答える
0

私はそれを行う方法を見つけました: プレーンな Java で Glue クラスを作成し、myApplet への静的参照を設定しました。次に、Groovy でこの Glue を拡張します。

// Java
class Glue extends PApplet {
  static Glue myApplet;
  // initialization block
  {
  myApplet = this;
  }
}

// Then Groovy
class MyApplet extends Glue {
  // ...
}

// And Groovy again
import static Glue.myApplet
class OtherClass {
  myApplet.whatever()
}

それは魅力のように機能します!

これを行う必要があるのは、OtherClass のインスタンスが何千もあり、同じアプレット オブジェクト (一意) への参照のコピーを何千も送信するのは実際的ではないためです。

このソリューションは、Groovy が作業を行う前に静的フィールドへの参照を設定します。

于 2012-09-24T11:39:28.320 に答える