首先,我一直在寻找答案,但是没有找到任何可以解释如何解决我的案件的东西。
我想在我的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);
...
}
是否甚至可以在活动中声明最终字段并稍后对其进行初始化?我要放弃最后的声明吗?
答案 0 :(得分:2)
是否甚至可以在活动中声明最终字段并稍后对其进行初始化?
不是在Java中,至少不是直接在Java中。 final
字段需要直接初始化(定义字段时)或在构造函数中初始化。您不能等到以后再定义它们。
Kotlin通过lateinit var
属性支持这种事情。
在Java中,您可以做的最接近的事情是让final
字段保存可以反过来保存所需值的内容。例如,您可以为final
有一个AtomicReference
字段,而set()
中的引用只有onCreate()
。但是,仅使用一个final
字段就是一种代码味道。