2012-11-12 13 views
4

基本上我想創建一個在編譯時已知的值的數據結構。在C我會做這樣的:如何在java中初始化一個靜態的對象數組

struct linetype { int id; char *descr; }; 

static struct linetype mylist[] = { 
    { 1, "first" }, 
    { 2, "second" } 
}; 

我已經在Java中發現的唯一soultion涉及在運行時創建數組:

public class Outer { 

    public class LineType { 
     int id; 
     String descr; 

     private LineType(int a, String b) { 
      this.id = a; 
      this.descr = b; 
     } 
    } 

    LineType[] myList = { 
     new LineType(1, "first"), 
     new LineType(2, "second"), 
    }; 

當結構得到長這看似繁瑣和低效(和複雜)。有另一種方法嗎? (注意:請忽略任何語法錯誤,因爲這只是爲這個問題創建的示例代碼,另外,我知道String是指向數據段的字符指針以外的其他字符,然而,該參數適用於基本數據類型也是如此)。

+2

都能跟得上推遲靜態初始化,沒有。 –

+3

很多編碼暴行都是以效率的名義提交:) – dasblinkenlight

回答

6

你必須要線型靜態類:

public class Outer { 

    public static class LineType { 
     int id; 
     String descr; 

     private LineType(int a, String b) { 
      this.id = a; 
      this.descr = b; 
     } 
    } 

    static LineType[] myList = { 
     new LineType(1, "first"), 
     new LineType(2, "second"), 
    }; 
} 
+0

不錯的主意。這樣運行時初始化只會發生一次,而不是每次創建實例。 – Martin

-1

您可以使用static blocks in Java對它們進行初始化。

class Outer 
{ 
    static 
    { 
    // whatever code is needed for initialization goes here 
    } 
} 
+0

也是,感謝指針! – Martin

1

在Java中,您不能在編譯時創建數組(數組是特殊類型的對象)。使用靜態塊(或)運行時(作爲實例變量),您可以創建數組,使用類加載時間。

實例靜態塊:

class TestClass 
{ 
    static { 
    arr[0] = "Hi";  
    arr[1] = "Hello";  
    arr[2] = "How are you?"; 
    } 
.... 
} 
+0

謝謝,指針很好。 – Martin

1

如果你想避免使用新的對象,你可以使用一個Map不是數組的。請注意,第一個值(1,2等)總是必須是唯一的。見the Oracle documentation for Map

private static Map<Integer, String> myMap = new TreeMap<Integer, String>(); 

static { 
    myMap.put(1, "first"); 
    myMap.put(2, "second"); 
} 
+0

有點不相關,但很好知道,因爲我可能需要關聯數組訪問。 – Martin

2

除非有一些東西我沒有收到,這應該是簡單:

Object[][] mylist = {{1, "first"}, {2, "second"}}; 
+0

你說得對,這會奏效。當然,訪問將通過索引進行,並且您將丟失所有類型信息,因此這隻能是非常簡單的情況下的解決方法(當性能優勢可以忽略不計時)。 – Martin

+0

你*可以*迭代一個數組。只是好奇,你看過枚舉嗎? – Friso

0

如果數據結構實際上非常混亂和複雜,而且你真的不想「混淆」你的代碼,你可以在一個完全獨立的小程序中創建它,並將其序列化/保存到磁盤。你的「真正的」程序只是反序列化/讀取它。

當然,這確實掩蓋了正在發生的事情,所以我會避免這種技術,除非你真的需要它。

如果問題僅僅是應用程序的初始加載速度很慢,你可以使用Holder Pattern