【发布时间】:2014-08-07 20:47:49
【问题描述】:
我一直在阅读和思考域对象的创建方式。
具体来说,从这篇阅读中:
Avoid JavaBeans style of construction
我同意作者的大部分推理。
但是,如果没有设置器,您最终可能会得到如下代码:
Book book = new Book("title", "author name", isbn, num_pages, blah, blah, blah);
在一个真实的项目中,你可以想象构造函数中一长串参数,以及使用它的困惑的程序员。
顺便说一句,Effective Java 中的第 1 项建议 (consider static factory methods instead of constructors) 不太适用,如果您有很多域对象,并且想要一个简单的解决方案。
那么,创建域对象的推荐方法是什么?
(这个问题不是针对 Java 的;也欢迎来自其他语言的 cmets)
【问题讨论】:
-
我稍微改变了你的标题,以避开基于意见的问题。
-
看到一个充满 setter 的 JavaBean 让我更加困惑——我永远不知道哪些属性是必需的,哪些不是!至少对于构造函数参数,我知道对象处于有效状态。如果一个类需要依赖,它应该在它的构造函数中。在类分解中减少构造函数参数的一种策略。
-
如果开发者感到困惑并且不想记住参数列表,或者有许多可能的有效方法来构造实例,则可以使用 Builder 模式。
-
@jrahhali 通过“类分解”,你的意思是把一些字段提取到它自己的类中吗?
-
@AlexanderLanger 好的,但是每个域对象类都需要这样做吗?有没有“抽象构建器模式”,所以构建器模式只需要创建一次?