2

当我在 clojure 中生成一个类时(通过gen-class),我通过javap检查得到以下定义:

public class foo.bar extends java.lang.Object implements java.io.Serializable{
    public final java.lang.Object state;
    public static {};
    public foo.bar();
    ...
}

我想知道构造public static {}是什么意思,因为我以前从未见过这样的东西……</p>

有人可以启发我吗?

4

3 回答 3

2

如果您查看 javap (with javap -c ...) 的完整输出,您会发现它只是 clojure 编译器在一流访问之前执行的一堆代码。通常它是稍后使用的变量的实习,依此类推。

于 2013-04-17T16:25:10.203 回答
2

静态部分包含在静态类初始化期间(在创建类的任何实例之前)运行的代码。

想一想在 Clojure 中具有带有副作用的命名空间级代码——这些副作用会在任何人需要或使用命名空间时立即发生,即使它们实际上并未调用任何函数。这是一个可比的情况。

于 2013-04-17T16:17:29.663 回答
1

听起来像是类上的静态初始化块。

您可以使用该块来初始化该类的所有静态变量。但是,在此之前我从未见过“公共”限定词。

在 Java 中试试这个,这样你就可以看到调用的顺序

public class StaticTest {

  { 
    System.out.println("Anonymous Block.");
  }

  static {
    //probably equivalent to that public {} you see on your code.
    System.out.println("Static Block.");
  }

  public StaticTest() {
     System.out.println("Constructor.");
  }

  public static void main(String[] args) {

    StaticTest test = new StaticTest() {
            {
                System.out.println("Anonymous block in instance.");
            }
    };
  }
}

当您执行此操作时,它会打印以下内容:

> $ java StaticTest 
> Static Block. 
> Anonymous Block. 
> Constructor.
> Anonymous block in instance.
于 2013-04-17T16:22:27.950 回答