首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java语法糖

Java语法糖
EN

Stack Overflow用户
提问于 2010-10-06 02:50:14
回答 7查看 7.8K关注 0票数 14

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

代码语言:javascript
复制
conext.checking(new Expectations() {
    { // <- what does this pair of braces do?
        oneOf(alarm).getAttackAlarm(null);
    }
});
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-06 02:57:49

它是一个实例初始化器,在创建的对象的上下文中调用代码。

这相当于

代码语言:javascript
复制
Expectations exp = new Expectations();
exp.oneOf(alarm).getAttackAlarm(null);
conext.checking(exp)

不管是谁写的,他可能会认为不声明变量(不是真的)或者代码更干净(我不同意)会更有效率。

这些初始化器像这样有用的主要地方是在实例化map时,即:

代码语言:javascript
复制
Map map = new HashMap() {{
  put("key1", "value1");   
  put("key2", "value2"); 
}};

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

票数 18
EN

Stack Overflow用户

发布于 2010-10-06 03:00:08

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

代码语言:javascript
复制
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
});
票数 4
EN

Stack Overflow用户

发布于 2010-10-06 03:02:44

它是一个实例初始化器(不是静态初始化器)。

考虑类的定义

代码语言:javascript
复制
public class Foo {
    private int i = getDefaultValue();

    private static int getDefaultValue() {
        return 5;
    }
}

初始化igetDefaultValue()调用本质上是一个代码块,它在每次构造Foo实例时运行。该表示法扩展了该函数以允许更复杂的初始化。例如。

代码语言:javascript
复制
public class Foo {
    private int i;

    {
        int z = 4 + 5;
        i = z + getDefaultValue();
    }

    private static int getDefaultValue() {
        return 5;
    }
}

在JMock中使用它的方式是一个技巧,使期望看起来像一个闭包构造。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3866764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档