2016-04-30 69 views
0

此:在Activity中聲明最終變量並在onCreate方法上實例化它們之間有什麼區別?

public class LoadingActivity extends Activity { 

     final private ContactManager cm = new ContactManager(this); 
     ... 

與此:

public class LoadingActivity extends Activity { 

    private ContactManager cm; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loading); 
     cm = new ContactManager(this); 
     ... 

我理解的最終意義,變量將無法重新實例化,但是我不知道使用哪種模式,這是如何影響垃圾收集器的?我猜想在第二個版本中,我可以使用onDestroy來通知垃圾收集器我完成了變量。那有意義嗎?這是需要的嗎?

回答

2

在Android中的組件類(例如,ActivityService),只使用了,你不需要this情況下,final -plus-初始化方法的具體情況。從onCreate()方法調用super.onCreate()之後,從這些組件的基類繼承的方法(例如,Activity)可能無效。

因此,在上面顯示的兩個示例中,第二個是正確的。

+0

你能解釋更多嗎?按照我看到的第二種方法也是正確的。 –

+0

@ZahanSafallwa:只有當可以安全地將其交給其他職業時,才引用一個對象(例如,在這種情況下爲「this」)。在這種情況下,'Activity'或'Service'在'super.onCreate()'之後纔會準備好。 *可能*''ContactManager'不會對它在構造函數中接收到的'Activity'做任何事情,除非它是安全的,但我們不知道,並且'ContactManager'將來可能會改變。因此,只有在'super.onCreate()'之後,我們知道這樣做是安全的時,才能創建'ContactManager'並將其傳遞給'Activity'。 – CommonsWare

+0

無論如何,在Activity類中的聲明時實例化變量是否正確?正如我所看到的,Activity的變量聲明部分就像一個構造函數,不是嗎? – Guy

0

在第一種情況下,您已將cm變量聲明爲final,因此您無法爲此變量定義任何新值。即現在你不能寫cm = xyz。

在第二種情況下,你可以隨時更改的釐米的值或者一些參數等

你的情況,重新初始化第二個方法最適合

+0

這個問題說明了「最後」的含義 –

1

一般來說,在Java中,它不是」在使用實例之前,最好使用this。使用構造函數是方法一的推薦方式,但Activity構造函數不會以這種方式使用,所以模式2在Android代碼方面是正確的。

如果您需要將變量設置爲final,則需要將其包裝到另一個Java類中,您可以在其中使用構造函數正確初始化該變量。

相關問題