Groovy&处理 - 如何获取applet的引用?

时间:2012-09-23 22:27:18

标签: java groovy processing

我用Java编写了一个程序,它使用了Processing中的PApplet类。该类实例化场景后面的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很早就完成了它的工作,甚至早于初始化块。至少这是我对Groovy类中myapplet被视为null的原因的解释。

我该怎样绕过这个?如何获取PApplet在场景后面构建的applet对象的引用?

3 个答案:

答案 0 :(得分:0)

@Lazy annotation是否绕过它?即:

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

然后致电MyApplet.instance

我想说这个静态实例方法相当脆弱,您可能需要考虑将Applet实例明确地传递给另一个类,或者使用其他方法而不是采用静态全局实例路由。

答案 1 :(得分:0)

为什么不直接将PApplet个实例的引用传递到OtherClass个实例?

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

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

如果您需要在OtherClass的构造函数之后访问PApplet的字段/方法,请将该引用存储在本地成员中:

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

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

这是在Java中使用Processing的常用方法。

答案 2 :(得分: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实例,向同一个applet对象(这是唯一的)发送数千个引用副本是不切实际的。

此解决方案在Groovy执行其操作之前设置对静态字段的引用。