2016-04-30 71 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类中,您可以在其中使用构造函数正确初始化该变量。

相关问题