不幸的是我没有编码的Java约五年来,我绝对不能记得是怎么或者为什么以下代码的工作。

我偶然发现了一个类似的例子,并打破了下来。强调的是部分下面的评论:我不会构造符号之后通过的框在双方括号内。不幸的是我找不到任何东西在Java文件或通过使用谷歌(什么词(s)应当我谷歌?).

package syntaxtest;

public class Main {

    public static void main(String[] args) {

        // What kind of notation is this?
        MyTest tester = new MyTest() {{
            setName("John Johnson");
        }};

        System.out.println(tester.getName());
    }
}


class MyTest {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这是我的问题:

  1. 这是怎么记号法/法叫什么?
  2. 在那里可以我读了一些文档?

我猜/希望我能回答第二个问题通过自己,如果有人能向我提供的回答第一个问题。

要清楚:我知道的输出 John Johnson ;)但是我不知道为什么它的工作。

有帮助吗?

解决方案

这是被称为 双撑初始化:

第一支具创建一个新的 AnonymousInnerClass,第二 声明的一个实例,初始化块 时运行的匿名内部 类实例化。这种类型的 初始化框正式称为 一个"实例的初始值",因为它 声明的内实例的范围 类--"静态的初始值" 是一个相关的概念在那里 关键字的静态之前放置的 撑开始的方框,以及哪 执行类级别以很快 作为这类装入器装载完成了 类(在指定 http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6) 初始化块可以使用任何 方法、领域和最终变量 提供包含的范围,但是 一个具有警惕的事实, 初始运行之前 构造方法。

这仅仅适用于非最终 课程,因为它创建了一个 匿名的子类。

其他提示

让我们的布局的代码有点不同:

MyTest tester = new MyTest() {
  {
    setName("John Johnson");
  }
};

什么你在这里看到的是被称为 双撑初始化.你有一个匿名内部的子类 MyTest, ,随着初始化块,这是一块包含的代码时运行,对象是构成。

通常,你会把这样的代码,在构造,但是由于匿名的内部类不可能具有的构造,这是唯一的方法,以保证码是运行时,它应该。

有的说,这是一个有点丑陋做到这一点。有更好的方法。但是,我使用它自己的场合,通常在以下成语,以创建一个不可改变地图:

final Map<String, Integer> textToInt = Collections.unmodifiableMap(new HashMap<String, Integer>() {{
    put("one", 1);
    put("two", 2);
    // etc
}});

它创建了一个新的地图,将复盖它,增加了一些值在初块,它包装在一个不可修改的地图。

MyTest tester = new MyTest() {{
   setName("John Johnson");
}};

是一样的

MyTest tester = new MyTest();
tester.setName("John Johnson");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top