[英]In Java, if a null pointer happes very seldom is it better to use catch instead of if
[英]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.