我今天遇到了这段代码,我不知道它是怎么工作的。我知道如何制作匿名类,但我习惯于看到一个方法签名,而不仅仅是一对花括号。这些大括号之间的代码是放入静态块中的吗?它会进入构造器吗?或者完全是别的什么东西?
conext.checking(new Expectations() {
{ // <- what does this pair of braces do?
oneOf(alarm).getAttackAlarm(null);
}
});发布于 2010-10-06 02:57:49
它是一个实例初始化器,在创建的对象的上下文中调用代码。
这相当于
Expectations exp = new Expectations();
exp.oneOf(alarm).getAttackAlarm(null);
conext.checking(exp)不管是谁写的,他可能会认为不声明变量(不是真的)或者代码更干净(我不同意)会更有效率。
这些初始化器像这样有用的主要地方是在实例化map时,即:
Map map = new HashMap() {{
put("key1", "value1");
put("key2", "value2");
}};我认为它实际上更具可读性。
发布于 2010-10-06 03:00:08
它是一个初始化程序块,但不一定是静态初始化程序块。它实际上是一个匿名内部类的构造函数。您通常会看到这种“双括号初始化”模式,可以方便地创建和填充集合:
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
});发布于 2010-10-06 03:02:44
它是一个实例初始化器(不是静态初始化器)。
考虑类的定义
public class Foo {
private int i = getDefaultValue();
private static int getDefaultValue() {
return 5;
}
}初始化i的getDefaultValue()调用本质上是一个代码块,它在每次构造Foo实例时运行。该表示法扩展了该函数以允许更复杂的初始化。例如。
public class Foo {
private int i;
{
int z = 4 + 5;
i = z + getDefaultValue();
}
private static int getDefaultValue() {
return 5;
}
}在JMock中使用它的方式是一个技巧,使期望看起来像一个闭包构造。
https://stackoverflow.com/questions/3866764
复制相似问题