最简洁的方法来初始化静态列表

时间:2017-12-19 16:23:51

标签: java

我正在学习Java,来自C和C#,并想知道是否没有更简洁的方法来初始化静态对象列表,而不是如下所示?

似乎有很多麻烦去创建并重复使用Part的构造函数,因为它本质上是一个简单的结构类型。

class Widget {

    private static class Part {
        public String number;
        public String description;

        Part(String number, String description)
        {
            // a constructor just to initialize public fields? ugh
            this.number = number;
            this.description = description;
        }
    }

    private static final List<Part> parts = List.of(
        new Part("ABC",  "Doo-hickey"), // < seems overwrought
        new Part("DEF",  "whadjamacalit"),
        new Part("HIJ",  "thing-a-ma-bob"),
        // ...
    );

    // ...
}

2 个答案:

答案 0 :(得分:3)

  

我正在学习Java,来自C和C#,并想知道是否没有   初始化静态对象列表比使用更简洁的方法   如下所示?

有一些类似冗长的替代方案,但由于你的主要反对似乎是使用new运算符和重复类名,不,没有办法避免这些或一个等价物。特别是,Java没有为复合类型的对象直接模拟C风格的初始化器。

你已经注意到我为&#34;等价物留下了一点摆动的空间&#34;而不是专门使用new和构造函数。事实上需要的只是一个可以在静态上下文中评估的适当类型的表达式。使用new运算符的最值得注意的替代方法是调用合适的静态方法或调用静态可访问对象的实例方法。

  好像很麻烦去,创造和反复使用   Part的构造函数,本质上是一个简单的struct类型。

Java不以这种方式区分不同类型的引用类型。实际上,虽然您没有为类Part定义任何方法,但它仍然具有从Object继承的方法,并且在这个意义上它不类似于&#34;简单的结构类型&#34;从某种意义上说,我认为你的意思。

另请注意,List<Part>可以包含Part的子类实例,因此从Java编译器的本地化角度来看,并不清楚每个元素应该具体为类Part }。可以想象,Java可以将其视为一种假设,但不这样做更简单。从我的角度来看,少数额外角色并不是什么大不了的事。

答案 1 :(得分:2)

你可能正在考虑做一些像C#:

这样的事情
new List<Part> {
    new {"ABC", "Doo-hickey"},
    new {"DEF", "whadjamacalit"}
}

这在Java中是不可能的,这在初始化较大的对象时很痛苦。您可以使用附加到Part的工厂方法。像Part.make("ABC", "Doo-hickey")这样的东西。在这种情况下,它不会节省你输入,但可能在更复杂的情况下。