繁体   English   中英

检查是否已初始化最终实例变量

[英]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没有执行那么它也必须赋值。

静态成员必须初始化为

静态的 { }

  • 你也在使用IDE,大多数IDE都有严格的代码错误设置,这些设置与编译器不同,所以你可能需要检查一下,如果上面没有解决它*

由于您尝试在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM