[英]Checking if a final instance variable has been initialized
我还在学习Java,但我不确定为什么会导致编译时错误:
public class AnswerRepository implements IAnswerRepository
{
private final static SQLiteDatabase database;
public AnswerRepository(Activity activity)
{
if(database != null)
{
database = DbOpenHelper.getInstance(activity);
}
}
}
我只是想在为其分配值之前检查是否先分配了最终变量。 但似乎编译时检查不喜欢它。 这是为什么?
final
变量只能初始化一次。 通常,它们必须在构造函数中初始化,但如果它们是static
,那么在定义它们时需要对它们进行初始化,如下所示:
private final static SQLiteDatabase database = new SQLiteDatabase(...);
或者,您可以稍后将其初始化:
private static SQLiteDatabase database;
static
变量将在调用对象构造函数之前初始化。 因此,在这种情况下, database
将始终为null
,因为它为null
,所以在对象构造函数中重新初始化它将导致编译时错误。
您无法在构造函数上初始化final static
变量。 要初始化使用内联语句,
private final static SQLiteDatabase database= DbOpenHelper.getInstance(activity);
或者,使用静态块。
private final static SQLiteDatabase database;
static{
database = DbOpenHelper.getInstance(activity);
}
初始化数据库变量。
private final static SQLiteDatabase database = null;
仅供参考:您应该在静态初始化程序中或直接初始化静态最终变量。 所以要么
static final SQLiteDatabase database = null;
要么
static final JButton button;
static {
button = new JButton();
}
阅读此文档了解更多信息。
这一点:
if (database != null)
database
不可能具有非空值:您没有在声明处初始化它,也没有在任何静态初始化块初始化它。 所以编译器正确地抱怨此变量为null
。
在声明中初始化它:
private final static SQLiteDatabase database = ...;
或者使用静态初始化块:
static {
database = ...;
}
最终的静态成员必须以静态方式初始化。 在你的情况下。 您需要删除final关键字。
静态变量属于Class而不属于该类的任何实例。 它们将在课程加载时间初始化。 因此,在构造函数中初始化它没有任何意义。 因为每次创建实例,都会重新初始化。 这可能会给您带来麻烦。 使用静态初始化块初始化它们。
最终变量最初为空,然后当它有参考时,它就不会改变。 所以你必须把
database = null;
否则你必须在if条件下指定一些值。
所以如果if
没有执行那么它也必须赋值。
静态成员必须初始化为
静态的 { }
块
由于您尝试在AnswerRepository构造函数中创建数据库变量的实例,因此我没有看到为什么在构造函数中存在空检查的必要性。
这应该在DbOpenHelper.getInstance(activity)中处理,而不是在这里。
您的代码可以如下所示,并将满足您的目的。
public class DbOpenHelper
{
private static SQLiteDatabase database;
public static SQLiteDatabase getInstance(Activity activity)
{
if( null == database )
{
database = new SQLiteDatabase(...);
}
return database;
}
}
创建单身人士有很多好方法。 选择一个好的。 上面发布的那个只是一个例子。
正如其他人所提到的,但下面的代码在静态块中
database = DbOpenHelper.getInstance(activity);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.