为什么写这系列博客?

在阅读《Effective Java》这本书时,我发现有许多地方需要仔细认真地慢慢阅读并且在必要时查阅相关资料才能彻底搞懂,相信有些读者在阅读此书时也有类似感受;同时,在解决疑惑的过程中,还存在着有些内容不容易查找、查找到的解答质量不高等问题,于是我决定把我阅读此书收获到的东西写成博客,期望能够解答某些读者之困惑。

为了方便大家阅读时按章节查找,我会按照原书籍写作顺序来划分博客章节。博客中主要包含以下内容:

  • 我对原文内容的理解(再加工)
  • 一些补充知识(需要理解这些知识才能真正理解该章节内容)

创建和销毁对象

何时考虑用静态工厂方法替代构造器?

无法准确描述

该实例无法通过构造器名称和参数完整描述。--》目的:方便用户正确调用。

BigInteger(int,int,Random) // 使用构造器

BigInteger.probablePrime(int,int,Random)//静态工厂方法

//以上构造器返回的实例可能为质数,通过构造器名称BigInteger和参数列表无法体现出质数,所以用静态工厂方法更好。

重复利用缓存

不可变类在创建实例时重复利用事先构建好或已缓存的实例。--》目的:避免创造不必要对象,降低内存提升性能;客户端可以用==操作符替代equals方法,提升性能,如:

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false); public static Boolean valueOf(boolean b){
return b? Boolean.TRUE:Boolean.FALSE;//通过valueOf调用得到的某个值的实例都是一个实例,所以可以用==来比较
}

隐藏实现类

返回接口类型,隐藏实现类--》目的:客户端使用只需关注接口功能即可,而不需要关注具体实现类;可灵活替换返回对象,而客户端不需要修改代码。

  1. 隐藏实现类的方法:使用内部类

    1. 静态内部类:Collections类中的UnmodifiableList内部类
    2. 实例内部类:LinkedList类中的ListItr内部类
  2. 导出实现类的方法:

    1. 静态工厂导出,如:Collections类中的静态工厂方法:unmodifiableList
    2. 通过实例方法导出,如:LinkedList类中的实例方法:listIterator
  3. 其他补充知识:

    1. 当内存中只需要一份,没有多个实例化的需求,不需要多份时,就考虑使用静态变量和静态方法(注意保持不可实例化,私有构造函数并抛出异常),如:各种工具类(java.lang.Math);管理器类(JDBC的java.sql.DriverManager)

    2. 内部类:

      1. 使用场景:该内部类只和当前外部类(相对而言)相关,而和其他类无关,其他类不需要知晓该类的存在。

      2. 静态or实例?如果该内部类不需要使用实例域或者外部类没有实例域,用静态内部类;反之用实例内部类

      3. 方法内部类和匿名内部类如何选择?

        1. 这两个类都是只限定在当前方法内可用,方法外不可用
        2. 如果只需要创建一个对象,使用匿名内部类即可;反之,需要多次创建对象,那么使用方法内部类
      4. 匿名内部类的常见使用场景:定义比较器或者事件响应逻辑

      5. 框架开发经验:考虑哪部分是不变的固定逻辑,哪部分是开发者需要自定义的逻辑,提供一个接口让开发者实现即可。

避免繁杂类型参数

利用编译器的类型推导,避免实例化时编写繁杂的类型参数--》目的:让代码更加简洁。

//未使用静态工厂写法
Map<String,List<String>> map = new HashMap<String,List<String>>(); //工具类
public class MapUtil{ //避免实例化
private MapUtil{} //静态工厂方法
public static <K,V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}
} //使用静态工厂写法
Map<String,List<String>> map = MapUtil.newIntance();

总结

提升简洁性:第四条

提高易用性:第一条;第三条前半部分

可扩展性:第三条后半部分

提升性能:第二条

Effective Java理解笔记系列-第1条-何时考虑用静态工厂方法替代构造器?的更多相关文章

  1. Effective java读书札记第一条之 考虑用静态工厂方法取代构造器

    对于类而言,为了让client获取它自身的一个实例,最经常使用的方法就是提供一个共同拥有的构造器. 另一种放你发,也应该子每一个程序猿的工具箱中占有一席之地.类能够提供一个共同拥有的静态 工厂方法.它 ...

  2. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  3. Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  4. effective java 3th item1:考虑静态工厂方法代替构造器

    传统的方式获取一个类的实例,是通过提供一个 public 构造器.这里有技巧,每一个程序员应该记住.一个类可以对外提供一个 public 的 静态工厂方法 ,该方法只是一个朴素的静态方法,不需要有太多 ...

  5. 改善JAVA代码01:考虑静态工厂方法代替构造器

    前言 系列文章:[传送门]   每次开始新的一本书,我都会很开心.新书新心情. 正文 静态工厂方法代替构造器 说起这个,好多可以念叨的.做了一年多的项目,慢慢也有感触. 说起构造器 大家很明白,构造器 ...

  6. Java - 用静态工厂方法代替构造器

    Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...

  7. 高效JAVA之用静态工厂方法代替构造器

    程序员这行干的久了,总会染上一些恶习,我就染上一个让人深恶痛绝,自己却津津乐道的习惯,还不想改的那种,它可以叫做强迫症,也可以叫做洁癖.那就是我不允许我的IDEA出现一点点警告,什么黄色背景,绿色波浪 ...

  8. Effective Java —— 用静态工厂方法代替构造器

    本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...

  9. Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法

    避免使用终结方法(finalizer) 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的. 不要把finalizer当成C++中析构函数的对应物.java中,当对象不 ...

  10. Effective Java读书笔记——第三章 对于全部对象都通用的方法

    第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定 ...

随机推荐

  1. uwp 获取屏幕分辨率

    public static Size ScreenSize { get { //screen resolution var height = DisplayInformation.GetForCurr ...

  2. nio-总结列表

    java IO体系图 IO流的操作规律总结: 1,明确体系:数据源:InputStream ,Reader数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符.数据 ...

  3. MySQL-进阶篇

    一.连接查询 图解示意图 1.建表语句 部门和员工关系表: CREATE TABLE `tb_dept` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ...

  4. 第三章 消息摘要算法--MD5--SHA--MAC

    6.1.MD5 推荐使用CC(即Commons Codec)实现 虽然已被破解,但是仍旧广泛用于注册登录模块与验证下载的文件的完整性 可以自己写一个注册登录模块:自己下载一个MD5加密的文件,然后通过 ...

  5. 如何快速的开发一个完整的iOS直播app(搭建Socket即时通讯服务器)

    在直播中,聊天和发礼物,需要用到及时通讯技术,市面上的App大多数采用的都是第三方SDK,融云,环信等,但是本例子采用websocket搭建及时通讯服务器. 即时通讯 即时通讯(Instant mes ...

  6. Hutool 实现非对称加密(RSA)

    目录 思路 生成RAS密钥 消息公钥加密.私钥解密 代码Demo 生成 A 的密钥 生成 B 的密钥 A 发送消息给 B B 解密 A 消息 对称加密中,我们只需要一个密钥,通信双方同时持有.而非对称 ...

  7. idea+maven打包.jar发布项目

    开发完项目后,idea+maven环境打包成.jar包,才能发布项目.下面记录常用的几种打包方式. 一,通过mvn命令打包 比较专业的用法是通过mvn命令打包: mvn clean package - ...

  8. 文章学习|开放,让5G网络更智能

    学习文章:开放,让5G网络更智能 介绍 从2G到5G,网络在不断发展,通信行业的生态系统在不断演进,运营商的角色也发生着改变. 在2G和3G时代,运营商作为服务提供商为用户提供通信业务和互联网业务,获 ...

  9. RocketMQ原理—3.源码设计简单分析下

    大纲 1.Producer作为生产者是如何创建出来的 2.Producer启动时是如何准备好相关资源的 3.Producer是如何从拉取Topic元数据的 4.Producer是如何选择Message ...

  10. java中的HsahMap

    HsahMap HashMap 是 Java 中最常用的集合类之一,它实现了 Map 接口,基于哈希表存储键值对 HashMap的存储是无顺序的 HashMap存储的是键值对(key-value)其中 ...