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

时间:2013-12-06 04:17:53

标签: java

我还在学习Java,但我不确定为什么会导致编译时错误:

public class AnswerRepository implements IAnswerRepository
{
    private final static SQLiteDatabase database;

    public AnswerRepository(Activity activity)
    {
        if(database != null)
        {
            database = DbOpenHelper.getInstance(activity);
        }
    }
}

我只是想在为其分配值之前检查是否先分配了最终变量。但似乎编译时检查不喜欢它。那是为什么?

enter image description here

9 个答案:

答案 0 :(得分:7)

final个变量只能初始化一次。通常,它们必须在构造函数中初始化,但如果它们是static,则在定义它们时需要对它们进行初始化,如下所示:

private final static SQLiteDatabase database = new SQLiteDatabase(...);

或者,您可以稍后对其进行初始化:

private static SQLiteDatabase database;

static变量将在调用对象构造函数之前初始化。因此,在这种情况下,database始终为null,因为它是null,在对象构造函数中重新初始化将导致编译时错误。

答案 1 :(得分:2)

您无法在构造函数上初始化final static变量。要初始化使用内联语句,

private final static SQLiteDatabase database= DbOpenHelper.getInstance(activity);

或使用静态阻止。

 private final static SQLiteDatabase database;

 static{
       database = DbOpenHelper.getInstance(activity);
 }

答案 2 :(得分:1)

初始化数据库变量。

private final static SQLiteDatabase database = null;

仅供参考:您应该在静态初始化程序中或直接初始化静态最终变量。所以要么

static final SQLiteDatabase database = null;

或者

static final JButton button;

static {
  button = new JButton();
}

请阅读此doc了解详情。

答案 3 :(得分:1)

此时:

if (database != null)

不可能 database具有非空值:您没有在声明处初始化它,也没有在任何静态初始化块初始化它。因此编译器正在抱怨此时变量为null

在声明中初始化它:

private final static SQLiteDatabase database = ...;

或者使用静态初始化块:

static {
    database = ...;
}

答案 4 :(得分:1)

必须以静态方式初始化最终静态成员。在你的情况下。您需要删除final关键字。

答案 5 :(得分:1)

静态变量属于Class,不属于该类的任何实例。它们将在课程加载时间初始化。因此,在构造函数中初始化它没有任何意义。因为每次创建实例,都会重新初始化。这可能会给您带来麻烦。使用静态初始化块初始化它们。

答案 6 :(得分:1)

最终变量最初为null且为&然后,当它有参考,那么它不会改变。 所以你必须把

database = null;

否则你必须在if条件下指定一些值。

所以如果if没有执行,那么它也必须分配值。

答案 7 :(得分:1)

静态成员必须在

中初始化

静态 { }

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

答案 8 :(得分:0)

由于您正在尝试在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);