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

如何在java中初始化静态对象数组,java,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;

基本上,我想创建一个编译时已知值的数据结构。在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" ),
    };
这看起来既麻烦又无效(当结构变得长而复杂时)。还有别的办法吗


(注意:请忽略任何语法错误,因为这只是为该问题创建的示例代码。此外,我知道字符串不是指向数据段的字符指针。但是,该参数也适用于基本数据类型)。

您可以使用初始化


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

静态块示例:

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

如果要避免使用新对象,可以使用
Map
而不是数组。请注意,第一个值(1、2等)必须始终是唯一的。看

私有静态映射myMap=newtreemap();
静止的{
myMap.put(1,“第一”);
myMap.put(2,“第二”);
}

必须将线型设置为静态类:

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

除非有什么我不明白的,否则这应该很简单:

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

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

当然,这确实掩盖了正在发生的事情,所以我会避免使用这种技术,除非你真的需要它


如果问题只是应用程序的初始加载速度太慢,那么可以使用

延迟静态初始值设定程序。许多编码错误都是以效率为名犯下的:)好主意。这样,运行时初始化只会发生一次,而不是每次创建实例都会发生。您是对的,这会起作用。当然,访问将是通过索引进行的,您会丢失所有类型信息,因此这只能在非常简单的情况下作为一种解决方法(当性能优势可以忽略不计时)。您可以迭代数组。我只是好奇,你们看过枚举了吗?有点不相关,但很高兴知道,因为我可能需要关联数组访问。
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" ),
    };
}
Object[][] mylist = {{1, "first"}, {2, "second"}};