在一行中实例化数组数组

时间:2014-07-22 19:29:52

标签: java arrays initialization declaration

我正在创建一个存储分层数据的Java类。它与XML非常相似,我将整个XML结构保留在以后由Java解析,但我们希望避免I / O开销。

相反,我希望将数据硬编码在全局变量的Java对象中。 XML代码如下所示:

<Group name="Order">
   <Milestone name="Tested" value="testedDate"/>
   <Milestone name="Created">
      <Milestone name="Delivered" value="deliveredDate"/>
      <Milestone name="Pressed" value="someString"/>
      <Milestone name="Assembled" value="whatever"/>
   </Milestone>
   <Milestone name="Ordered" value="something"/>
</Group>

所以我用setter和getter以及多态构造函数创建了类。 Group类有一个构造函数,将name属性作为String输入,将Milestone对象数组作为另一个输入:

public Group(String name, Milestone[] milestones) { ...... }

请注意,Milestone元素可以包含相同类型的子元素。所以我创建了一个带有两个构造函数的Milestone类。第一个构造函数处理第一个Milestone元素。它只将name和value属性作为String输入。第二个构造函数将name属性作为String输入,并将Milestone对象数组作为第二个输入。

public Milestone(String name, String value) { .....}
public Milestone(String name, Milestone[] subMilestones) { ...... }

但是现在我要做的是在一行代码中实例化所有这些,如下所示:

Group[] groups = {
   new Group("Order",{
      new Milestone("Tested","testedDate"),
      new Milestone("Created",{
         new Milestone("Delivered","deliveredDate"),
         new Milestone("Pressed","someString"),
         new Milestone("Assembled","whatever")})
      new Milestone("Ordered","something")
   }
   new Group("Invoice",...
   ...
   ...
};

似乎不喜欢这样。简而言之,它不喜欢我打开括号来在Group数组的声明中启动一个新的“新”Milestone对象数组。有没有办法在一行代码中完成所有这些(例如,在一个声明中,在末尾有一个分号)?

2 个答案:

答案 0 :(得分:3)

您必须显式实例化子数组,如

Group[] groups = {
   new Group("Order", new Milestone[] {
      new Milestone("Tested","testedDate"),
      new Milestone("Created", new Milestone[] {
         new Milestone("Delivered,"deliveredDate"),
         new Milestone("Pressed,"someString"),
         new Milestone("Assembled,"whatever")}),
      new Milestone("Ordered","something")
   }
   new Group("Invoice",...
   ...
   ...
};

答案 1 :(得分:0)

来自变量声明

Group[] groups = ...

编译器只知道groupsGroup个对象的数组。它不知道内部结构。尽管如此,这个内部结构可以用单个语句构建,但你必须声明它:

Group[] groups = {
   new Group("Order", new Milestone[] {
      new Milestone("Tested","testedDate"),
      new Milestone("Created", new Milestone[] {
         new Milestone("Delivered,"deliveredDate"),
         new Milestone("Pressed,"someString"),
         new Milestone("Assembled,"whatever"))}
      new Milestone("Ordered","something")
   }
   new Group("Invoice",...
   ...
   ...
};