簡體   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