Android Activity 中 final 字段、构造函数和 onCreate 之间的冲突

Conflict between final field, constructor and onCreate in Android Activity

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

我想在我的 Android FragmentActivity 中声明几个 final 字段并稍后初始化它们(我需要先执行 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);
        ...
    }

是否可以在 activity 中声明最终字段并稍后初始化它们?我要放弃最后的声明吗?

Is it even possible to declare final fields in an activity and initialize them later?

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

Kotlin 通过 lateinit var 属性支持此类事情。

您可以在 Java 中做的最接近的事情是让 final 字段保存一些内容,而这些内容反过来又保存您需要的值。例如,您可以为 AtomicReference 设置一个 final 字段,而 onCreate() 中的引用只有 set()。但是,采用这种方法只是为了拥有一个 final 字段是一种代码味道。