4

有没有办法在Java中将数据结构初始化为常量值?我搜索了高低,找不到任何这样的技术。我特别想初始化一个包含混合数据类型的类,例如 String 和 int。

class xyz {
      String a;
      int    b;
}

static final xyz example1 = { "string value", 42 };    // This doesn't work.

static final xyz[] example2 = { { "value a", 42 }, { "value b", 43 } };  // this also doesn't work

我可以初始化 String 数组,甚至是 String 的二维数组,但由于某种原因,我无法初始化记录结构或记录结构数组。我在 Delphi 中经常这样做,发现没有这个功能很难生活。

好吧,我已经编程了大约 40 年,所以我并不是一个新手。我需要知道这样的事情是否可行。我确实希望将常量数据嵌入到我的应用程序中,而不是从文件中读取,并且使用赋值语句来设置数据类型违背了将它们声明为常量(最终)的目的。

感谢您的任何建议或意见。我真的很想为这个问题找到一个好的解决方案,因为我有很多 Pascal 代码要转换为 Java,而且我不想重新设计所有的数据结构。

4

4 回答 4

9

如果您不想使用其他答案中建议的构造函数或静态块,则可以使用双括号初始化语法

static final xyz example1 =
  new xyz() {{ a = "string value"; b = 42; }}; 

请注意,它创建了一个匿名类。
您的第二个示例如下所示:

static final xyz[] example1 = new xyz[] {
  new xyz() {{ a = "value a"; b = 42; }},
  new xyz() {{ a = "value b"; b = 43; }}
};

但是,如果您有权访问xyz该类,则添加一个带有两个参数的构造函数将更具可读性并且(稍微)更有效。

于 2012-09-25T17:41:24.397 回答
3

一种方法是为xyz类编写构造函数来实现你想要的。

class xyz {
      String a;
      int    b;

         xyz(String tempStr, int tempInt)
              {
            this.a = tempStr;
            this.b = tempInt;
             }
}

static final xyz example1 = new xyz("String value",  42);
于 2012-09-25T17:31:43.490 回答
0

您可以为此使用枚举

enum xyz {
    VALUE_A("value a", 42), VALUE_B("value b", 43);

    String a;
    int b;

    xyz(String str, int value) {
        a = str;
        b = value;
    }

    static EnumSet<xyz> bothValues = EnumSet.of(xyz.VALUE_A, xyz.VALUE_B);
}
于 2012-09-25T17:45:55.133 回答
0

您可以编写构造函数xyz(String,int)或使用默认构造函数并初始化static块中的值:

static final xyz example1 = new xyz();
static { 
  example1.a = "string value";
  example1.b = 42;
}

注意:您应该可以访问初始化类中的字段。

另请注意: ifxyz是一个内部类 - 您可能需要将其声明static为上述代码才能工作。


PS java约定使用大写字母作为类名的第一个字母,所以它可能应该重命名为Xyz

于 2012-09-25T17:33:11.930 回答