②话不说▼ 2012▼ java 语法 括号

007.Java的大括号语法糖

Java 的大括号({ ,curly brace)除了必要的语法规定外, 其更主要的是使代码简洁,易读。

@史荣久 / 2012-07-04 / CC-BY-SA-3.0

1. 作用域

在不同的代码位置有不同的叫法,如静态域,实例域等

// 静态域
static{
// 各种初始化等
}
// 叉叉域,让s在自己的域中,互不干涉。
{String s = "1";}
{String s = "2";}

2. 建数组

String[]   s = {"1","2","3"};
String[][] s = {{"1","2"},{"3","4"}};

3. 匿名类

//new class-name ( [ argument-list ] ) { class-body }
//new interface-name () { class-body }

new Thread(){
    public void run(){
    }
}.start();

4. 双括号

双括号”{{}}”,用来初始化,使代码简洁易读。
第一次括号是建个匿名类,第二层建个实例域执行代码。

// 通常的是这样
private static final Set<String> CODE = new HashSet<String>();
static {
    CODE.add("1");
    CODE.add("2");
}
// 可以这样
private static final Set<String> CODE = new HashSet<String>(){{
    add("1");
    add("2");
}};

// 层次多点的
private static final Set<List<String>> TREE = new HashSet<List<String>>(){{
    add(new ArrayList<String>() {{
        add("1");
        add("2");
    }});
    add(new ArrayList<String>() {{
        add("3");
        add("4");
    }});
    add(new ArrayList<String>() {{
        add("5");
        add("6");
    }});
}};

5. 顺序性

// 知道下面代码输出什么吗? 是213 :D
public class Test{
    public Test(){
        System.out.println(1);
    }
    public static void main(String[] args) {
        new Test(){{ System.out.println(3); }};
    }
    {System.out.println(2);}
}

补充 2015-04-07

感谢狮友Artlongs在oschina上指出,匿名类会产生OOM。

详见:http://www.importnew.com/15087.html
原因:匿名类持有其封装实例的引用,不能回收又暴露主子。
所以,匿名类要慎用,尤其生命周期不受控的。

《007.Java的大括号语法糖》 Java 的大括号(`{` ,curly brace)除了必要的语法规定外,其更主要的是使代码简洁,易读。
题图:光荣的参加了,公开,公正,公平的人大代表选举。面对四个名字,真实一脸迷茫。