创建具有许多字段的对象的最易维护和可读的方法

时间:2014-02-23 21:37:51

标签: java oop

我正在创建一个Java类,它应该封装天体的六个轨道元素,相同天体的六个密切元素,身体的质量和身体的名称。这意味着我的Java对象必须使用不少于14个参数创建,我现在考虑将另外四个扰动常数作为参数包含在内,这将使该数字达到十八个。

这是十四个参数的外观:

new Planet("Mercury", 3.3022E23,0.387098, 0., 0.205637, 0.00002123, 7.00559, -0.00590158, 252.252, 149473., 77.4577, 0.1594, 48.3396, -0.122142)

我看过周围的人说,一个接收十个以上参数的课程可能设计得很差。他们还说一个班级应该做一件事,一件事。好吧,我只是按字面意思做一件事,到目前为止,班级唯一做的就是计算天体的位置,将这些参数作为时间的函数来计算。

处理这种情况的最佳做法是什么?

4 个答案:

答案 0 :(得分:2)

我推荐有效Java,第2版中Joshua Bloch(第2项)的Bloch Builder:

http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2

这是一个专门为具有大量字段的类设计的模式,尽管它用于可选参数,但不是这种情况。但是,我仍然认为这可能是你接近它的好方法。如

Planet p = new Planet.Builder("Mercury").gravity(3.3022E23).
   anotherAttribute(0.387098).avgTemp(0.).
   somethingElse(0.205637).andAnotherThing(0.00002123).
   ....
   build();

(将它们改为有意义的东西......我不知道这些数字实际代表什么:)

我建议对Planet对象中的setter,以使字段不可变(https://www.google.com/search?q=fields+immutable+java+benefit)。

我希望这会有所帮助。

答案 1 :(得分:2)

我会有一堆安装员。也许使用name作为构造函数参数。只是为了让它更清晰易读。如果你在构造函数中设置它们,那么确定哪些14个以上的参数对于读者来说太难了。或者按照别人的建议使用建造者。两者对我来说都是一样的。

答案 2 :(得分:1)

我更愿意结合已经提到的解决方案 - 正如你在介绍中所写的那样“我正在创建一个Java类,它应该封装天体的六个轨道元素,相同元素的六个密切元素,质量身体和身体的名称。“,在我看来,你可以将每个六个参数分组到一个新的数据结构中,这样你最终得到Planet构造函数的四个参数(名称,质量和两个)每个参数对象有六个自己的值) - 下一步我会问自己六个轨道和密切元素是否具有额外的含义或仅仅是一组六个(如“任意数”)元素,因此可以表示为一个列表

答案 3 :(得分:0)

我建议您使用Builder Design Pattern。 如果您使用的是龙目岛注释,则可以使用@Builder注释生成所有详细代码。

@Builder
class Some{
private String a;
private String c;
private String d;
private String e;
}

您可以使用以下语义生成对象:

Some someObject = Some.builder()
                  .a("a")
                  .b("b)
                  .c("c")
                  .d("d")
                  .e("e)
                  .build();