Effective Java(第3版)第2章总结

第1条:用静态工厂方法代替构造器

创建对象,尽可能考虑使用静态工厂方法,方便使用。书里说了一堆好处及一些缺点,还是需要自己领悟。

  • 参考:Stream.of(...), String.valueOf(...)

第2条:遇到多个构造器参数参数时,要考虑使用构建器

当对象参数 >= 4时,如果使用构造器,可能需要写很多构造器。此时建议使用建造者模式,使用时,链式调用,既方便又清晰。

  • JDK中线程池类java.util.concurrent.ThreadPoolExecutor参数就比较多,虽然提供了静态工具类java.util.concurrent.Executors,但是阿里规范并不推荐使用。

建造者模式改造类的步骤:

  1. 创建一个类,并编写一个public static内部类,使其拥有和外部类一样的参数
  2. 外部类的对象创建由内部类去完成,所以外部类构造函数须设置private,其参数为内部类对象,从而可以把参数传递给外部类。同时,内部类也要提供一个实例化外部类的方法
  3. 内部类编写setter的变种方法,返回值设置为内部类,方便链式调用
  4. 外部类的成员变量的值均由内部类设置,一经初始化,便不会更改值,所以需要加final修饰符
public class Person {

    private final String name;

    private final String sex;

    private final int age;

    private final Date birthday;

    private final String hobby;

    public static class Builder {
        private String name;

        private String sex;

        private int age;

        private Date birthday;

        private String hobby;

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder sex(String sex) {
            this.sex = sex;
            return this;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Builder birthday(Date birthday) {
            this.birthday = birthday;
            return this;
        }

        public Builder hobby(String hobby) {
            this.hobby = hobby;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }

    private Person(Builder builder) {
        name = builder.name;
        sex = builder.sex;
        age = builder.age;
        birthday = builder.birthday;
        hobby = builder.hobby;
    }
    
}

第3条:用私有构造器或者枚举类型强化 singleton 属性

一般面试都会问到的问题:单例实现方法,分为饿汉式和懒汉式

  • 饿汉式
    • 直接 new 即可,
    private static final Singleton singleton = new Singleton()
    
    • 枚举
    public enum SingletonEnum {
    
        INSTANCE;
    }
    
  • 懒汉式
    • 双重 if 检查,注意使用volatile修饰符
    public class Singleton {
    
        private Singleton() {
        }
    
        private static volatile Singleton instance = null;
    
        // 参考第83条慎用延迟初始化:读取volatile变量开销比局部变量大,此处先使用局部变量接受,可以减少volatile变量读取次数
        public static Singleton getInstance() {
            Singleton result = instance;
            if (result == null) {
                synchronized (Singleton.class) {
                    if (result == null) {
                        result = instance = new Singleton();
                    }
                }
            }
    
            return result;
        }
    }
    
    • 私有静态内部类,只有被第一次调用的时候才会初始化
    public class Singleton {
    
        private Singleton() {
        }
    
        public static Singleton getInstance() {
            return SingletonHolder.singleton;
        }
    
        private static class SingletonHolder {
            private static Singleton singleton = new Singleton();
        }
    }
    

PS:内部类相当于外部类的一个成员变量,所以外部类可以通过内部类访问其私有属性

第4条:通过私有构造器强化不可实例化的能力

参考第3条:单例构造函数私有化

第5条:优化考虑依赖注入来引用资源

有许多类会依赖一个或多个底层的资源,把资源作为构造函数参数传入,这种模式叫做依赖注入。

第6条:避免创建不必要的对象

  1. 定义字符串不要用new String(...)
  2. 创建正则 Pattern 实例的成本很高,应该提取为成员变量,并设置public static final,以便复用
  3. for循环不要使用"+"号连接字符串,应该使用 StringBuilder
  4. 基本类型和其包装类型,请不要混用,避免不必要的装箱拆箱

第7条:消除过期的对象引用

其目的是防止内存泄漏。比如

  1. ThreadLocal 需要调用 remove() 方法才能清除引用
  2. 数组元素不再需要的时候,需要设置 arr[i] = null
  3. 集合、Map等等也是如此

第8条:避免使用终结方法和清除方法

finalizer 垃圾回收方法不可预测,很危险,一般情况下是不必要的。Java9中用清除方法 cleaner 代替了它,虽然没有 finalizer 方法危险,但是依旧不可预测,一般情况下也是不必要的。

第9条:try-with-resources 优先于 try-finally

资源都要实现接口java.lang.AutoCloseable,才可以使用这个语法糖。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335