8

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

这看起来既麻烦又无效(当结构变得又长又复杂时)。还有其他方法吗?

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

4

6 回答 6

9

您必须使 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" ),
    };
}
于 2012-11-12T19:01:54.413 回答
1

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

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

static {
    myMap.put(1, "first");
    myMap.put(2, "second");
}
于 2012-11-12T19:00:07.390 回答
1

除非有什么我没有得到,这应该很简单:

Object[][] mylist = {{1, "first"}, {2, "second"}};
于 2012-11-12T19:02:40.747 回答
1

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

静态块示例:

class TestClass
{
     static {
     arr[0] = "Hi";     
     arr[1] = "Hello";     
     arr[2] = "How are you?"; 
    }
....
}
于 2012-11-12T18:57:26.143 回答
0

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

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

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

于 2012-11-12T19:07:48.680 回答
-1

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

class Outer
{
  static 
  {
    // whatever code is needed for initialization goes here
  }
}
于 2012-11-12T18:57:14.160 回答