【问题标题】:Strange JAVA Syntax奇怪的 JAVA 语法
【发布时间】:2015-03-28 15:28:53
【问题描述】:

以下代码在 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 语句的大括号是什么?那是一个数组吗?如果是这样,那里不应该有任何分号吗?

我找不到任何解释这种语法的地方。请给出一些详细解释的链接。

【问题讨论】:

标签: java spring hibernate jakarta-ee


【解决方案1】:

这是一个返回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 对象。

【讨论】:

    【解决方案2】:

    类中可以包含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类的任何方法,就像你可以在构造函数中调用它们一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多