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

9
基本上,我想创建一个在编译时已知值的数据结构。在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" ),
    };

这种方式看起来很笨重,而且在结构变得长而复杂时也不太有效。有没有其他方法?(注:请忽略任何语法错误,因为这只是为了提出问题而创建的示例代码。此外,我知道字符串与指向数据段的字符指针是不同的东西。但是,这个参数也适用于原始数据类型。)

3
以效率为名,犯下了许多编码残留。 - Sergey Kalinichenko
6个回答

10

你需要将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" ),
    };
}

好主意。这样运行时初始化只会发生一次,而不是每次创建实例都会发生。 - Martin

1
在Java中,您无法在编译时创建数组(数组是特殊类型的对象)。您可以使用静态块(或)运行时(作为实例变量)来创建数组。
例如静态块:
class TestClass
{
     static {
     arr[0] = "Hi";     
     arr[1] = "Hello";     
     arr[2] = "How are you?"; 
    }
....
}

1

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

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

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

有点不相关,但很好知道,因为我可能需要关联数组访问。 - Martin

1
除非有什么我不明白的地方,否则应该很简单:
Object[][] mylist = {{1, "first"}, {2, "second"}};

1
你说得对,这个方法可以行得通。当然,访问将通过索引进行,并且您会失去所有类型信息,因此这只能是在非常简单的情况下使用的解决方法(当性能收益可以忽略不计时)。 - Martin
你可以迭代一个数组。只是好奇,你看过枚举吗? - Friso

0
如果数据结构非常混乱和复杂,并且您真的不想在代码中“弄乱”它,可以在完全分离的小程序中创建它,并将其序列化/保存到磁盘。您的“真正”的程序只需反序列化/读取它。
当然,这确实会使情况变得模糊,因此除非您真的需要,否则我会避免使用这种技术。
如果问题仅在于应用程序的初始加载速度较慢,您可以使用Holder Pattern延迟静态初始化器。

-1

你可以使用 Java 中的静态块来初始化它们。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接