爪哇句法糖

2022-09-04 00:48:43

我今天遇到了这个代码块,我不知道它是如何工作的。我知道如何制作匿名类,但我习惯于看到一个方法签名,而不仅仅是一对大括号。这些大括号之间的代码是否放入静态块中?它是否进入构造函数?还是完全是别的什么?

conext.checking(new Expectations() {
    { // <- what does this pair of braces do?
        oneOf(alarm).getAttackAlarm(null);
    }
});

答案 1

它是一个实例初始值设定项,用于在所创建对象的上下文中调用代码。

这等效于

Expectations exp = new Expectations();
exp.oneOf(alarm).getAttackAlarm(null);
conext.checking(exp)

无论谁写它,都可能认为他通过不声明变量(不真实)或它是更干净的代码(我不同意)来提高效率。

这些初始值设定项的主要用处是实例化映射时,即:

Map map = new HashMap() {{
  put("key1", "value1");   
  put("key2", "value2"); 
}};

我认为这实际上更具可读性。


答案 2

它是初始值设定项块,但不一定是静态初始值设定项块。它实际上是匿名内部类的构造函数。您通常会看到此“双括号初始化”模式,以方便地创建和填充集合:

private final Collection<Integer> FIXED_COLLECTION = Collections.unmodifiableCollection(new HashSet<Integer>() 
{ // first set of braces declares anonymous inner class
    { add(1); add(2); add(3); } // second set is initializer block
});

推荐