[英]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.