我用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对象的引用?
答案 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执行其操作之前设置对静态字段的引用。