Java语法糖

geo*_*wa4 13 java syntactic-sugar

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

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

Rev*_*nzo 18

这是一个实例初始化,与创建的对象的上下文中调用的代码.

这相当于

Expectations exp = new Expectations();
exp.oneOf(alarm).getAttackAlarm(null);
conext.checking(exp)
Run Code Online (Sandbox Code Playgroud)

写这篇文章的人可能会认为他不是通过声明一个变量(不是真的)或者它是更清晰的代码(我不同意)来提高效率.

这些初始化程序像这样有用的主要位置是实例化地图,即:

Map map = new HashMap() {{
  put("key1", "value1");   
  put("key2", "value2"); 
}};
Run Code Online (Sandbox Code Playgroud)

我认为实际上更具可读性.

  • 可读,是的.但我觉得这样做绝对令人憎恶(无论如何都在测试/脚本代码之外).它为您创建的每个地图创建一个额外的类(和类文件),占用更多的permgen空间等. (3认同)
  • dty:不对.我刚刚做了一个测试类来验证.构造函数在初始化程序之前运行.静态初始化程序在构造函数之前运行,但这不是静态初始化程序. (2认同)