Java 使用混合数据类型将数据结构初始化为常量值

Java 使用混合数据类型将数据结构初始化为常量值,java,Java,在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 },

在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
我可以初始化字符串数组,甚至是二维字符串数组, 但由于某些原因,我无法初始化记录结构或数组 记录结构。我在Delphi中经常这样做,发现这非常困难 生活中没有这个特征

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


谢谢你的建议或意见。我真的很想找到一个解决这个问题的好办法,因为我有很多Pascal代码要转换成Java,我不想重新设计所有的数据结构。

一种方法是为
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);

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

static final xyz example1 = new xyz();
static { 
  example1.a = "string value";
  example1.b = 42;
}
注意:您应该可以访问初始化类中的字段

还要注意:如果
xyz
是一个内部类,则可能需要将其声明为
static
,以使上述代码正常工作



另外,java约定使用大写字母作为类名的第一个字母,因此可能应该将其重命名为
Xyz

如果您不想使用其他答案中建议的构造函数或静态块,可以使用:

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

static final xyz[] example1 = new xyz[] {
  new xyz() {{ a = "value a"; b = 42; }},
  new xyz() {{ a = "value b"; b = 43; }}
};
但是,如果您有权访问
xyz
类,添加一个包含两个参数的构造函数将更具可读性,并且(稍微)更高效。

您可以使用它

枚举xyz{ 价值A(“价值A”,42),价值B(“价值B”,43); 字符串a; int b; xyz(字符串str,int值){ a=str; b=值; } 静态EnumSet bothValues=EnumSet.of(xyz.VALUE\u A,xyz.VALUE\u B); }
该示例似乎编译得很好,但我仍然不知道如何扩展语法来创建xyz类的记录数组。我应该把[]放在哪里才能使我的第二个示例起作用。如果我错过了显而易见的,请原谅。你能给我举一个例子,说明如何基于双括号初始化语法来创建数组吗?我可以按任意顺序初始化记录的字段吗?或者省略一些字段并为它们指定默认值吗?谢谢!我明天早上就去试试。现在是凌晨3点左右!你的方法对我很管用!谢谢我将考虑使用构造函数方法作为替代,但是这种方法在语法上与Delphi代码最匹配,无论是好还是坏,导致Delphi Pascal转换到java的工作更少。当然,效率很重要,但可读性也是一个因素,尽管目前只有我一个人阅读我的代码!我真正的代码更复杂,有更多的字段,其中一些是枚举,但我只是选择了一个带有字符串和int的简单示例,以便讨论一些内容。谢谢你和所有其他人的回答。我特别想避免语法看起来像一大堆单独的赋值语句!
static final xyz[] example1 = new xyz[] {
  new xyz() {{ a = "value a"; b = 42; }},
  new xyz() {{ a = "value b"; b = 43; }}
};
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);
}