0

我用 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 很早就完成了它的工作,甚至早于初始化块。至少这是我对为什么myapplet在 Groovy 类中被视为 null 的解释。

我该如何规避这个?如何获取对在PApplet幕后构建的小程序对象的引用?

4

3 回答 3

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 回答
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

@Lazy注释是否绕过它?IE:

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

然后打电话MyApplet.instance

我会说这种静态实例方法相当脆弱,您可能需要考虑将 Applet 实例显式传递给您的其他类,或者使用其他方法而不是采用静态全局实例路由。

于 2012-09-24T00:05:51.573 回答