在onCreate中实例化成员对象与在声明期间实例化的区别

5

我基本上询问这两种方法之间的区别:

public class MyClass extends AppCompatActivity {
    private ObjectType mObject = new ObjectType();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // do stuff with mObject

并且

public class MyClass extends AppCompatActivity {
    private ObjectType mObject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mObject = new ObjectType();

我希望我的表述足够清晰。我在犯难的是,我们何时选择其中一种而不是另一种。


如果“objectType”没有与上下文相关的约束,则没有太大区别。 - Blackbelt
@Blackbelt,我对这一切都很新,所以你可能需要为我解释得更简单一些。你所说的上下文相关约束是什么意思? - DoubleBass
objectType 是否依赖于类型为 Context 的对象? - Blackbelt
@Blackbelt 不,它只是一个单独的类/对象类型(例如您可能自己创建的类)。尽管如果它是“Context”,那又有什么关系呢? - DoubleBass
那么它多多少少是一样的。 - Blackbelt
2个回答

5

就功能而言,没有什么区别。

第一个在Activity对象创建时生成(即调用new myClass())。 在Android系统创建期间的某个时间点进行此操作。

第二个将在系统最终调用onCreate()时创建。

问题可能出现在您的构造函数需要Context的对象上。 例如,您可以执行以下操作:

public class myClass extends AppCompatActivity {
    private objectType object = new objectType(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //do stuff with object

如果您的应用程序在此时尝试从Context中提取不存在的资源,则应用程序将突然崩溃。(请记住,在此时Activity还没有创建)

因此,如果您的对象必须使用Context,则必须在调用onCreate之后或之后创建它。


1
那么 onCreate 技术上来说是 Activity 的构造函数吗?如果不是,Activity 构造函数的作用是什么?您是说 this 需要先调用构造函数吗? - DoubleBass
1
我不确定这样想是否有帮助。更像是回调而不是构造函数。Activity 有一个构造函数(所有类都有)。然而,所有的 Activity 必须 有一个默认构造函数,否则应用程序将崩溃(这是该类的要求,而不是所有类的要求)。系统创建一个 Activity 实例。它构建它。给它所需的资源。然后当它构建完成时,它调用 Activity 上的 "onCreate()" 来告诉你(开发者)一切准备就绪。这时候你可以进行进一步的自定义活动设置。 - DeeV
1
我想问的是,在调用onCreate()之前,是否有一个名为myClass()的构造函数在幕后被调用了?如果有,它实际上在做什么? - DoubleBass
是的。这是默认构造函数(无参构造函数)。如果类不做任何事情,它们不必强制实现它。换句话说,实际的Activity构造函数什么也不做。你可以重写并创建一个默认构造函数(public myClass(){}),但这是不常规的。99.9%的时间你只想依赖于onCreate() - DeeV
需要注意的是,如果您创建了另一个构造函数,例如 public myClass(String name){},那么应用程序将崩溃,因为不再有公共构造函数,而系统正是期望这样的构造函数。 - DeeV
显示剩余4条评论

1

正如您可能已经知道的那样,Activity有一个明确定义的生命周期。在构造函数和onCreate中创建新实例并不总是重要的,但在以下情况下,您肯定更喜欢使用onCreate:

  1. 如果新对象需要有效的Context,而这在onCreate()之前不可用。您无法在构造函数中完成此操作。
  2. 如果您希望尽快释放资源,直到您不再需要它为止,onDestroy提供了与活动生命周期相关的与onCreate相似的方法。这可能比将对象创建为“final”并存储更快地回收对象。虽然这并不是严格必要的,但它使读者清楚地了解您希望按照Activity的生命周期进行工作,而不仅仅是处理对象实例本身。

1
我熟悉生命周期的基础知识(创建、暂停、停止、销毁等),但我并不完全了解它们在后端是如何协同工作的。当你说“你不能在构造函数中这样做”时,你确切指的是什么(类的成员变量声明部分)?至于你的第二个观点,你是在暗示最好在onCreate()内实例化吗? - DoubleBass
正确,但我的问题是当Activity实例首次可用(通过“this”)时。 - DoubleBass
我不确定我理解了。“available”和“valid”的区别是什么? - DoubleBass
不要假设一个对象存在就已经完全准备好运行了。这就是为什么有一个生命周期的定义。在onCreate中有效,在onDestroy之后无效。 - Doug Stevenson
一般来说是这样的。对有经验的开发人员来说并不会令人惊讶。 - Doug Stevenson
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接