有没有办法在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,我不想重新设计所有的数据结构。
答案 0 :(得分:9)
如果您不想使用其他答案中建议的构造函数或静态块,则可以使用double brace initialization syntax:
static final xyz example1 = new xyz() {{ a = "string value"; b = 42; }};
请注意,它会创建一个匿名类 你的第二个例子如下:
static final xyz[] example1 = { new xyz() {{ a = "value a"; b = 42; }},
new xyz() {{ a = "value b"; b = 43; }}
};
但是,如果您有权访问xyz
类,则添加一个带有两个参数的构造函数将更具可读性并且(略微)更高效。
答案 1 :(得分: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);
答案 2 :(得分:0)
您可以编写构造函数xyz(String,int)
或使用默认构造函数并初始化static
块中的值:
static final xyz example1 = new xyz();
static {
example1.a = "string value";
example1.b = 42;
}
注意:您应该可以访问初始化类中的字段。
另请注意:如果xyz
是内部类 - 您可能需要将其声明为static
才能使上述代码生效。
P.S。 java约定使用大写字母作为类名中的第一个字母,因此它应该重命名为Xyz
答案 3 :(得分:0)
您可以将Enums用于此
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);
}