为什么人们很少在Java中使用匿名构造函数

时间:2013-12-14 08:05:39

标签: java

昨天,我在java中学习了匿名构造函数,而不是匿名类。我以前没见过这个构造函数,所以我在Google上搜索它。结果是我知道如何使用它以及它是什么。但是关于这种用法的信息很少。

匿名构造函数是一个带有一对大括号的块代码。匿名将在公共构造函数之前运行,并在静态代码块之后运行。

我想知道为什么没有人使用这个匿名构造函数。当我们使用它时,是否会对我们的java应用程序产生一些不良影响?

感谢您的帮助。

以下是匿名构造函数的示例:

    public class Static_Super_Conustruct {    

    static class Base{    
        {    
            System.out.println("Base anonymous constructor");    
        }    
        public Base() {    
            System.out.println("Base() common constructor");    
        }    
        static{    
            System.out.println("Base static{} static block");    
        }    
    }    

    static class Sub extends Base{    

        {    
            System.out.println("Sub anonymous constructor");    
        }    
        public Sub() {    
            System.out.println("Sub() common constructor");    
        }    
        static{    
            System.out.println("Sub static{} static block");    
        }    
    }    

    /**  
     * @param args  
     */    
    public static void main(String[] args) {    
        new Sub();    
    }    
//  Results:    
//  Base static{}static block    
//  Sub static{}static block    
//  Base anonymous constructor   
//  Base() common constructor    `enter code here`
//  Sub anonymous constructor    
//  Sub() common constructor

}    

4 个答案:

答案 0 :(得分:1)

该构造称为实例初始值设定项。我怀疑它很少使用,因为大多数初始化可以在字段初始化器或构造函数中执行。

但是,我曾经使用过一次,它派上了用场。我有一个初始化为某个字段的字段,我想在分配默认值之前更改它以检查几个属性。我本可以在构造函数中编写该代码,但构造函数位于文件的另一端。将实例初始化器放在声明和记录字段的位置旁边是有用且方便的。

答案 1 :(得分:0)

继续沿着推测的路线,不时有前后构造函数调用的愿望,特别是在你无法完全控制层次结构实现的时候。

比如说,例如你DIDN&T已经拥有Base的源代码,但是想在构造函数运行之前初始化一些实例变量。这是一个边缘案例,但它确实出现了。

我同意另一张海报,这是一个反直觉的方法,有人甚至可能会说有一种hackish的感觉,但它理论上可以解决这个例子。

答案 2 :(得分:0)

1)我认为它没有被使用,可能是因为

anonymous constructor {
   do A
}

regular constructor {
   do B
}

基本相同
regular constructor {
    do A
    do B
}

后者更明确,更明确。

2)大多数人并不真正了解它 我自己完全忘记它的存在 但现在我回想起我已经读过它了 曾经在SCJP书中,但那是很久以前的事。

答案 3 :(得分:0)

这种结构的罕见用法是出于代码风格

的原因

我猜大多数人不喜欢这些实例初个化块的主要原因是,实例初始化在源代码中被碎片化了。例如,大多数人会直接在字段声明或构造函数体中查找字段初始化。

双括号符号

然而,我不时会偶然发现实例初始化程序块的使用。请考虑以下表达式:new java.util.HashSet<String>() {{ add("foo"); add("bar"); }}。此单行创建一个新的HashSet,其中插入了初始字符串值"foo""bar"。这里使用的构造有时被称为“双括号”,即使它不是自己的构造,但是两个构造的混合:外大括号创建HashSet的匿名子类,内大括号是实例初始化器对于这个子类。在这样的构造中,没有方法被覆盖,在实例初始化程序块中调用可覆盖的方法是安全的。

静态初始化程序块

尽管它不是相同的构造,但值得注意的是,静态类初始化存在相同的东西:static { }。这个东西似乎更常见,因为类初始化没有“构造函数”。