奇怪的JAVA语法

时间:2015-03-28 15:28:54

标签: java spring hibernate java-ee

以下代码用于Spring - Hibernate Full Java Based Configuration在很多地方(如here):

Properties hibernateProperties() {
        return new Properties() {
            {
                setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
                setProperty("hibernate.show_sql", "true");
                setProperty("hibernate.format_sql", "true");
                setProperty("use_sql_comments", "true");
                setProperty("hibernate.hbm2ddl.auto", "none");
            }
        };
    }

这是一个类中的方法。我认为返回对象是一个匿名类对象(请告诉我,如果我错了)。括起setProperty语句的大括号是什么?那是一个阵列吗?如果是这样的话,那里不应该有任何分号?

我无法找到解释此语法的任何地方。请提供一些详细解释的链接。

2 个答案:

答案 0 :(得分:0)

这是一个返回Properties类型对象的方法。该方法创建一个anonymous class,它定义了一个实例initializer block,它在返回的对象中设置了一些属性:

return new Properties() {
    // this is an instance initializer block which pre-sets some properties
    {
         setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
         setProperty("hibernate.show_sql", "true");
         setProperty("hibernate.format_sql", "true");
         setProperty("use_sql_comments", "true");
         setProperty("hibernate.hbm2ddl.auto", "none");
     }
};

它创建一个具有预定义属性的Properties对象。

答案 1 :(得分:0)

类中可以包含initialization blocks(静态和非静态)。在非静态块的情况下,它们的代码将在类的每个构造函数的开头移动(实际上几乎在开始时因为它将在显式或隐式super()调用之后立即放置)。

所以类似

class Foo{

    void method(){
        System.out.println("method()");
    }

    Foo(){
        System.out.println("constructor of Foo");
    }

    {
        System.out.println("initialization block");
        method();
    }

    public static void main(String[] args) {
        Foo f = new Foo();
    }

}

相同
class Foo {

    void method() {
        System.out.println("method()");
    }

    Foo() {
        super();
        //initialization block is moved here
        {
            System.out.println("initialization block");
            method();
        }
        System.out.println("constructor of Foo");
    }


    public static void main(String[] args) {
        Foo f = new Foo();
    }

}

因此,在这个初始化块中,您可以调用Foo类的任何方法,就像您可以在构造函数中调用它们一样。