[英]Java initializing iVars outside the scope of any method
Java的新手,我對這段代碼有些困惑:
public class CitiesDialog extends DialogFragment {
private AsyncHttpClient client = new AsyncHttpClient();
}
客戶端正在任何方法范圍之外初始化。 這到底是什么意思? CititiesDialog的每個實例是否都有單獨的客戶端對象? 還是這是某種靜態/類變量?
最后,這是Java的規范嗎? 初始化超出構造函數/方法等范圍的變量...
謝謝
client
是CitiesDialog
的實例變量
您創建的每個CitiesDialog
都將擁有自己的client
。
這種初始化僅適用於您首次創建類的實例的情況。 您可以隨后更改client
。
這在Java中完全正常。
您在這里看到的是private AsyncHttpClient
,它本身只是一個類變量。
然后,您會看到聲明new AsyncHttpClient()
,該聲明已分配給client
。 對於創建的每個新對象都會發生這種情況。
解決這是否是常態? 我認為是的,常見的用例是列表,最好盡早初始化它們:
public class A {
private final List<String> list = new ArrayList<>();
}
這將防止您以后再獲得NPE
,因為您忘記了聲明列表。
另一件事也有幫助,那就是聲明字段final
如果在賦值后再也不要更改它,那么編譯器還可以確保在聲明或構造函數中對該字段進行初始化。
CititiesDialog的每個實例是否都有單獨的客戶端對象?
是的,因為它沒有標記為static
。
這是Java中的規范嗎? 初始化超出構造函數/方法等范圍的變量...
這不是異常,特別是如果您有多個構造函數並且不想重復初始化。
最后,這是Java的規范嗎? 初始化構造函數/方法范圍之外的變量
實際上,這只是語法糖,因此不需要在每個構造函數中重復相同的初始化。 編譯后,初始化代碼將成為每個構造函數的一部分(委托給其他構造函數的那些除外)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.