簡體   English   中英

Java在任何方法范圍之外初始化iVars

[英]Java initializing iVars outside the scope of any method

Java的新手,我對這段代碼有些困惑:

public class CitiesDialog extends DialogFragment {
    private AsyncHttpClient client = new AsyncHttpClient();
}

客戶端正在任何方法范圍之外初始化。 這到底是什么意思? CititiesDialog的每個實例是否都有單獨的客戶端對象? 還是這是某種靜態/類變量?

最后,這是Java的規范嗎? 初始化超出構造函數/方法等范圍的變量...

謝謝

clientCitiesDialog的實例變量

您創建的每個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.

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