首页 > 解决方案 > Android Activity中final字段、构造函数和onCreate之间的冲突

问题描述

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

我想在我的 Android FragmentActivity 中声明一些最终字段并稍后对其进行初始化(我需要先执行 onCreate 以获取所需的数据)我知道我只能在构造函数中初始化最终字段,但是,它在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);
        ...
    }

甚至可以在活动中声明最终字段并稍后初始化它们吗?我要放弃最后的宣言吗?

标签: androidandroid-activityconstructorfinal

解决方案


甚至可以在活动中声明最终字段并稍后初始化它们吗?

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

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

在 Java 中,您可以做的最接近的事情是让final字段包含一些东西,而这些东西又包含您需要的值。例如,您可以有一个final字段AtomicReference,并且只有set()中的引用onCreate()。然而,仅仅为了拥有一个final字段而采用这种方法是一种代码味道。


推荐阅读