【发布时间】:2015-02-08 12:52:02
【问题描述】:
我从Effective Java
一书中读到了下面提到的这两条语句第一
不幸的是,JavaBeans 模式有其严重的缺点。 自己的。因为构造是跨多个调用拆分的,所以一个 JavaBean 可能在其构造的中途处于不一致的状态。 类没有强制一致性的选择,仅仅通过 检查构造函数参数的有效性。尝试使用 处于不一致状态的对象可能会导致失败 远离包含错误的代码,因此难以 调试。
第二次
一个相关的缺点是 JavaBeans 模式排除了 使类不可变的可能性(第 15 项),并且需要添加 程序员努力确保线程安全。这是 可以通过手动“冻结”来减少这些缺点 当它的构造完成并且不允许它存在时的对象 一直使用到冷冻,但这种变体笨重,很少用于 实践。此外,它可能会在运行时导致错误,因为编译器 不能确保程序员在对象上调用 freeze 方法 使用前。
,我无法理解这两个语句到底想表达什么,你们能帮我理解上面的语句吗?
更新
我已经阅读了这篇文章的答案(不是全部),大多数社区成员建议我使用Constructor Pattern,但在同一本书中这些行已经说过
静态工厂和构造函数有一个限制:它们不 可以很好地扩展到大量可选参数。考虑案例 代表营养成分标签的类别 包装食品。这些标签有一些必填字段——份量, 每个容器的份量和每份的卡路里——超过 20 可选字段——总脂肪、饱和脂肪、反式脂肪、胆固醇、 钠等。大多数产品只有少数的非零值 这些可选字段。
对于这个场景,我们使用telescoping constructor 模式但是
伸缩构造函数模式有效,但很难编写 有很多参数时的客户端代码,而且更难阅读 它。读者不知道所有这些价值观的含义和必须 仔细计算参数以找出答案。相同的长序列 类型化的参数可能会导致细微的错误。如果客户不小心 反转两个这样的参数,编译器不会抱怨,但是 程序在运行时会出现异常
这就是为什么建议使用JavaBeans 而不是constructor pattern
【问题讨论】:
标签: java