如何初始化java中的静态对象数组

时间:2012-11-12 18:55:50

标签: java

基本上我想创建一个在编译时已知的值的数据结构。在C中我会这样做:

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

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

我在Java中发现的唯一灵魂涉及在运行时创建数组:

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是指向数据段的字符指针以外的其他东西。但是,该参数适用于原始数据类型)。

6 个答案:

答案 0 :(得分:8)

您必须使LineType成为静态类:

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" ),
    };
}

答案 1 :(得分:2)

除非有一些我没有得到的东西,否则这应该是这样简单:

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

答案 2 :(得分:1)

在Java中,您无法在编译时创建数组(数组是特殊类型的对象)。使用静态块(或)运行时(作为实例变量)的类加载时间可以创建数组。

静态块示例:

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

答案 3 :(得分: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");
}

答案 4 :(得分:0)

如果数据结构确实非常麻烦和复杂,并且你真的不想“混乱”你用它编码,你可以在一个完全独立的小程序中创建它,并将其序列化/保存到磁盘。你的“真实”程序只是反序列化/读取它。

当然,这确实模糊了正在发生的事情,所以除非你确实需要,否则我会避免这种技术。

如果问题只是应用程序的初始加载速度很慢,您可以使用Holder Pattern推迟静态初始化程序

答案 5 :(得分:-1)

您可以使用static blocks in Java初始化它们。

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