簡體   English   中英

為什么人們很少在Java中使用匿名構造函數

[英]Why people seldom use the anonymous constructor in 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

}    

該構造稱為實例初始化程序 我懷疑它很少使用,因為大多數初始化可以在字段初始化器或構造函數中執行。

不過我確實使用了一次,它派上了用場。 我有一個初始化為某個字段的字段,我想在分配默認值之前更改它以檢查幾個屬性。 我本可以在構造函數中編寫該代碼,但構造函數位於文件的另一端。 將實例初始化程序放在聲明和記錄字段的位置旁邊是有用且方便的。

繼續沿着推測的路線,不時有前后構造函數調用的願望,特別是在你無法完全控制層次結構如何實現的時候。

比方說,例如你沒有Base的源代碼,但想在構造函數運行之前初始化一些實例變量。 這是一個邊緣情況,但它確實出現了。

我同意另一張海報,這是一種反直覺的方法,甚至可能會說有一種hackish的感覺,但它理論上可以解決這個案例。

1)我認為它的使用可能不是因為

anonymous constructor {
   do A
}

regular constructor {
   do B
}

基本上是一樣的

regular constructor {
    do A
    do B
}

后者更明確,更清晰。

2)大多數人並不真正了解它。
我自己完全忘記了存在。
但現在我回想起我已經讀過它了
曾經在SCJP書中,但很久以前。

這種結構的罕見用法是出於代碼風格的原因

我想大多數人不喜歡這些實例初始化塊的主要原因是,實例初始化在源代碼中被碎片化了。 例如,大多數人會直接在字段聲明或構造函數體中查找字段初始化。

雙括號表示法

但是,我不時會偶然發現實例初始化程序塊的使用。 請考慮以下表達式: new java.util.HashSet<String>() {{ add("foo"); add("bar"); }} new java.util.HashSet<String>() {{ add("foo"); add("bar"); }} new java.util.HashSet<String>() {{ add("foo"); add("bar"); }} 這個單行創建一個新的HashSet,其中插入了初始字符串值"foo""bar" 這里使用的構造有時被稱為“雙括號”,即使它不是自己的構造,但是兩個構造的混合:外大括號創建HashSet的匿名子類,內大括號是實例初始化器對於這個子類。 在這樣的構造中,沒有方法被覆蓋,在實例初始化塊中調用可覆蓋的方法是安全的。

靜態初始化程序塊

盡管它不是相同的構造,但值得注意的是,靜態類初始化存在相同的東西: static { } 這個東西似乎更常見,因為類初始化沒有“構造函數”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM