android - 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);
...
}
甚至可以在活动中声明最终字段并稍后初始化它们吗?我要放弃最后的宣言吗?
解决方案
甚至可以在活动中声明最终字段并稍后初始化它们吗?
不是在Java中,至少不是直接的。final
字段需要直接初始化(在定义字段时)或在构造函数中。您不能等到稍后的某个时间点再定义它们。
lateinit var
Kotlin 通过属性支持这种事情。
在 Java 中,您可以做的最接近的事情是让final
字段包含一些东西,而这些东西又包含您需要的值。例如,您可以有一个final
字段AtomicReference
,并且只有set()
中的引用onCreate()
。然而,仅仅为了拥有一个final
字段而采用这种方法是一种代码味道。
推荐阅读
- angular - 使用响应式表单的 HTML 数字输入显示必需的验证器错误而不是无效模式
- javascript - 所有设备中的点击事件都会检测到触摸设备中的触摸吗?
- docker - 通过 VPN 从 Docker 恢复 Dotnet
- javascript - 在数组 Ramda 中通过 id 查找对象
- macos - wxPython macOS 暗模式支持和 pyinstaller
- javascript - 用一个循环查找 JS 数组的最频繁项
- java - 无法浏览/查看 Java 源文件 | VS 代码
- node.js - MongoDB - 如果特定条件如何选择字段?
- javascript - 通过 javascript 中的 Promise 链接编辑机器人的不和谐消息
- machine-learning - Keras val_acc 和 model.evaluate acc 不匹配