什么是双大括号初始化语法({{…}})在Java?


当前回答

你是说像这样的事?

List<String> blah = new ArrayList<String>(){{add("asdfa");add("bbb");}};

这是在创建时初始化数组列表(hack)

其他回答

关于双大括号初始化的有趣应用,请参阅这里的Dwemthy 's Array in Java。

摘录

private static class IndustrialRaverMonkey
  extends Creature.Base {{
    life = 46;
    strength = 35;
    charisma = 91;
    weapon = 2;
  }}

private static class DwarvenAngel
  extends Creature.Base {{
    life = 540;
    strength = 6;
    charisma = 144;
    weapon = 50;
  }}

现在,准备好迎接香肠味和培根味的大战吧!

你是说像这样的事?

List<String> blah = new ArrayList<String>(){{add("asdfa");add("bbb");}};

这是在创建时初始化数组列表(hack)

这似乎与flash和vbscript中流行的with关键字相同。这是一种改变事物的方法,仅此而已。

第一个大括号创建了一个新的匿名内部类。 第二组大括号创建了一个实例初始化器,类似于Class中的static block。

例如:

   public class TestHashMap {
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<String,String>(){
        {
            put("1", "ONE");
        }{
            put("2", "TWO");
        }{
            put("3", "THREE");
        }
        };
        Set<String> keySet = map.keySet();
        for (String string : keySet) {
            System.out.println(string+" ->"+map.get(string));
        }
    }
    
}

它是如何工作的

第一个大括号创建了一个新的匿名内部类。这些内部类能够访问它们的父类的行为。因此,在本例中,我们实际上是在创建HashSet类的子类,因此这个内部类能够使用put()方法。

第二组大括号只是实例初始化器。如果你还记得核心java概念,那么你可以很容易地将实例初始化器块与静态初始化器关联起来,因为类似struct的大括号。唯一的区别是静态初始化器添加了static关键字,并且只运行一次;不管你创建了多少个对象。

more

1-没有双括号这样的东西: 我想指出,没有双大括号初始化这样的东西。传统的初始化块只有一个大括号。第二个花括号块与初始化无关。答案说这两个大括号初始化了一些东西,但它不是这样的。

2-不只是匿名类,而是所有类: 几乎所有的答案都说它是在创建匿名内部类时使用的。我认为阅读这些答案的人会得到这样的印象,即这只在创建匿名内部类时使用。但它在所有课程中都被使用。读这些答案,它看起来像是一些全新的专门用于匿名类的特殊功能,我认为这是误导。

3- The purpose is just about placing brackets after each other, not new concept: Going further, this question talks about situation when second opening bracket is just after first opening bracket. When used in normal class usually there is some code between two braces, but it is totally the same thing. So it is a matter of placing brackets. So I think we should not say that this is some new exciting thing, because this is the thing which we all know, but just written with some code between brackets. We should not create new concept called "double brace initialization".

创建嵌套的匿名类与两个大括号无关: 我不同意创建太多匿名类的说法。你创建它们不是因为一个初始化块,而是因为你创建了它们。即使你没有使用两个大括号初始化,它们也会被创建,所以即使没有初始化,这些问题也会发生……初始化不是创建初始化对象的因素。

此外,我们不应该谈论使用这个不存在的东西“双括号初始化”,甚至是普通的单括号初始化所产生的问题,因为所描述的问题只是因为创建匿名类而存在,所以它与原始问题无关。但是所有的答案都给读者留下了这样的印象:创建匿名类并不是错误,而是这个邪恶的(不存在的)叫做“双括号初始化”的东西。