2012-09-25 26 views
4

有什麼方法可以在Java中將數據結構初始化爲常量值? 我搜索了高和低,並找不到任何這樣的技術。 我特別想要初始化一個包含混合數據類型的類, ,比如String和int。使用混合數據類型將數據結構初始化爲常量值

class xyz { 
     String a; 
     int b; 
} 

static final xyz example1 = { "string value", 42 }; // This doesn't work. 

static final xyz[] example2 = { { "value a", 42 }, { "value b", 43 } }; // this also doesn't work 

我可以初始化字符串的數組,甚至字符串, 的二維陣列,但由於某種原因,我不能初始化的記錄結構或 記錄結構的陣列。我經常在Delphi中這樣做,並發現它很難在沒有此功能的情況下生活。

好的,我已經編程了大約40年,所以我不完全是一個新手。我需要知道這樣的事情是否可能。我確實希望將常量數據嵌入到我的應用程序中,而不是從文件中讀入,並且使用賦值語句來設置數據類型,這會破壞將它們聲明爲常量(最終)的目的。

感謝您的任何建議或意見。我真的很想找到一個很好的解決方案,因爲我有很多Pascal代碼要轉換爲Java,我不想重新設計所有的數據結構。

回答

3

一種方法是爲xyz類編寫構造函數以實現您想要的功能。

class xyz { 
     String a; 
     int b; 

     xyz(String tempStr, int tempInt) 
       { 
      this.a = tempStr; 
      this.b = tempInt; 
      } 
} 

static final xyz example1 = new xyz("String value", 42); 
0

你可以寫一個構造函數xyz(String,int)或使用默認的構造函數,並在static塊初始化值:

static final xyz example1 = new xyz(); 
static { 
    example1.a = "string value"; 
    example1.b = 42; 
} 

注意:你應該有機會獲得在初始化類中的字段。

另請注意:如果xyz是內部類 - 您可能需要將上述代碼聲明爲static


P.S. Java約定使用大寫字母作爲類名中的第一個字母,所以它應該重命名爲Xyz

+0

這個例子也可以爲我的情況下工作。謝謝。 – user1698044

9

如果您不想使用其他答案中提出的構造函數或靜態塊,您可以使用double brace initialization syntax

static final xyz example1 = new xyz() {{ a = "string value"; b = 42; }}; 

請注意,它會創建一個匿名類。
你的第二個例子是這樣的:

static final xyz[] example1 = { new xyz() {{ a = "value a"; b = 42; }}, 
           new xyz() {{ a = "value b"; b = 43; }} 
           }; 

但是,如果你有機會到xyz類,並稱需要兩個參數的構造函數將更具可讀性和(略)更有效。

+0

謝謝。我認爲任何一種方法都行得通。 – user1698044

+0

該示例似乎編譯正常,但我仍然不知道如何擴展語法來創建類xyz的記錄數組。我在哪裏可以使[]使我的第二個例子工作。請原諒我,如果我錯過了明顯的。你能告訴我一個基於雙括號初始化語法的數組的例子嗎?我可以以任意順序初始化記錄的字段,還是省略一些字段並讓它們分配默認值? – user1698044

+0

@ user1698044看我編輯 – assylias

0

您可以使用Enums這個

enum xyz { 
    VALUE_A("value a", 42), VALUE_B("value b", 43); 

    String a; 
    int b; 

    xyz(String str, int value) { 
     a = str; 
     b = value; 
    } 

    static EnumSet<xyz> bothValues = EnumSet.of(xyz.VALUE_A, xyz.VALUE_B); 
} 
+1

我的真實代碼更復雜,並且有更多的字段,其中一些枚舉,但我只是選擇了一個帶有String和int的簡單示例,以便有一些可以討論的內容。感謝您的回答和所有其他人。我特別試圖避免看起來像一大堆單獨賦值語句的語法! – user1698044