Android活动中final字段,构造函数和onCreate之间的冲突

时间:2018-12-21 12:44:26

标签: android android-activity constructor final

首先,我一直在寻找答案,但是没有找到任何可以解释如何解决我的案件的东西。

我想在我的Android FragmentActivity中声明一些最终字段,然后稍后对其进行初始化(我需要先执行onCreate才能获取所需的数据) 我知道我只能在构造函数中初始化最终字段,但是,在还没有初始化其他任何东西的情况下,它被称为 before onCreate,因此应用程序崩溃并出现java.lang.NullPointerException。

我的代码:

public class MyActivity extends FragmentActivity {
    private final File mPhotosDir;
    private final ConstraintLayout mConstraintLayout;
    ...
    // This is the constructor of MyActivity activity
    public MyActivity() {
        this.mPhotosDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        this.mConstraintLayout = findViewById(R.id.myActivityConstraintLayout);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }

是否甚至可以在活动中声明最终字段并稍后对其进行初始化?我要放弃最后的声明吗?

1 个答案:

答案 0 :(得分:2)

  

是否甚至可以在活动中声明最终字段并稍后对其进行初始化?

不是在Java中,至少不是直接在Java中。 final字段需要直接初始化(定义字段时)或在构造函数中初始化。您不能等到以后再定义它们。

Kotlin通过lateinit var属性支持这种事情。

在Java中,您可以做的最接近的事情是让final字段保存可以反过来保存所需值的内容。例如,您可以为final有一个AtomicReference字段,而set()中的引用只有onCreate()。但是,仅使用一个final字段就是一种代码味道。