effective java p9 JavaBeans模式阻止了把类做成不可变的可能,这需要程序员付出额外的努力来确保它的线程安全.…
类有多个可选参数的解决方案: 1. 重叠构造器模式可行,但是当有许多参数的时候,客户端代码会很难编写,并且仍然较难以阅读. 2. JavaBeans模式,调用一个无参构造器来创造对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数. 缺点:构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态.阻止了把类做成不可变的可能,需要程序员确保线程安全. 3. Builder模式,模拟了具名的可选参数. 模式 优 劣 重叠构造器 写法最简单 多参数时候难读.难…
一.静态工厂和构造器的局限性 面对需要大量可选参数才能构建对象时,静态工厂和构造器并不能随着可选参数的增加而合理扩展. 假设创建一个类Person需要使用大量的可选参数,其中两个参数是必填的,剩下的都是可选的,面对这种情况在使用静态工厂和构造器创建对象时通常使用叠加的方式实现: /** * @描述 为了方便演示,就设计四个可选参数 **/ public class Person { private final String name; // 必填 private final int age; /…
public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; // 构造器,静态内部类 public static class Builder { // 必要参数 p…
静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数. 当一个类中有若干个必选属性和多个可选属性时,采用重叠构造器模式.JavaBeans模式或者Builder模式,但各有优劣. 当有很多参数的时候,重叠构造器模式下客户端代码会很难编写,并且仍然较难以阅读. JavaBeans模式调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数.因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态.与此相关的另一点不…
最近看<Effective Java>这本被很多同行称为神作的书,但是这本书很多地方缺少了举例不好懂,下面是关于我对书上知识的理解. 一.<Effective Java>中文版2  ——第二章  第2条:遇到多个构造器参数时要考虑用构建器 原文语段:遗憾的是,JavaBeans模式自身有着很严重的缺点.因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态.类无法仅仅通过检验构造器参数的有效性来保证一致性.试图使用处于不一致状态的对象,将会导致失败,这种失…
在新建对象时,若需要对大量可选参数进行赋值,最常见的做法是JavaBeans模式,即调用一个无参构造方法创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数.代码示例如下: public class Complex { private int size; private int color; private int range = 0; private int num = 0; public Complex(int size, int color) { this.siz…
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 条目2:当构造方法参数过多时使用builder模式 静态工厂和构造方法都有一个限制:它们不能很好地扩展到很多可选参数的情景.请考虑一个代表包装食品上的营养成分标签的例子.这…
前言 <Effective Java>中文第三版,是一本关于Java基础的书,这本书不止一次有人推荐我看.其中包括我很喜欢的博客园博主五月的仓颉,他曾在自己的博文<给Java程序猿们推荐一些值得一看的好书>中也推荐过.加深自己的记忆,同时向优秀的人看齐,决定在看完每一章之后,都写一篇随笔.如果有写的不对的地方.表述的不清楚的地方.或者其他建议,希望您能够留言指正,谢谢. <Effective Java>中文第三版在线阅读链接:https://github.com/sjs…
作为一名程序开发者,设计模式其实一直有在接触,只是没有专门的去学过,所以可能对设计模式没有一个系统的理解.在一次项目中,需要使用到第三方服务商提供的功能,为了尽快的熟悉其功能代码,在官网下了demo来研究其功能实现,发现一个用来封装消息通知的类是这样写的: package cn.jpush.api.push.model.notification; import cn.jpush.api.push.model.PushModel; import cn.jpush.api.utils.Precond…