2.1 用静态工厂方法代替构造器

静态工厂方法:

不通过 new (如:Date date = new Date();) 而是用一个静态方法来对外提供自身实例的方法叫做静态工厂方法(Static factory method)(如:Integer number = Integer.valueOf("3");)[new 的作用是 在用 new 构造一个新的类实例时 是告诉 JVM JVM 自动在内存中开辟一个空间 调用构造函数初始化成员变量 最终引用返回给调用方]

静态工厂方法和构造器不同的优势:

1.它们有名称

2.不必要每次创建的时候都新创建一个对象(省内存)

3.可以返回原返回类型的任何子类型的对象(里式替换)

4.所返回对象的类可以随着每次调用而发生变化 取决于静态工厂方法的参数值

5.方法返回的对象所属的类在编写包含该静态工厂方法的类时可以不存在(如:Map<String, Date> mp = new HashMap<>();)

静态工厂的缺点:

1.类如果不含有共有的或受保护的构造器 就不能被子类化

2.难以发现

  静态方法惯用名称:

    from:类型转换方法 只有单个参数返回是一个对应的实例 Date d = Date.from(instant); // Date 转化为时间戳

    of:聚合方法 Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);

    valueof:一种替代方法 BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);

2.2遇到多个构造器参数时要考虑使用构造器

重叠构造器模式可行 但是当有许多参数的时候 客户端代码会很难编写 && 难以阅读 可以使用 JavaBean 模式 先调用一个无参构造器来创建对象 然后再调用 setter 方法设置必要参数

JavaBean 可能处于不一致的状态 所以它把类做成不可变是不可能的 这样对于线程安全就要额外作出努力

解决办法是可以用 Builder 模式 Builder 模式模拟了具名的可选参数 Builder 模式也适用于类层次结构

即:如果类的构造器或者静态工厂中具有多个参数 设计这种类时 Builder 模式就是一种不错的选择

2.3用私有构造器或者枚举类型铅华 Singleton 属性

Singleton:是指仅仅被实例化一次的类 通常代表一个无状态的对象 (使类成为 Singleton 会使它的客户端测试很困难) 单元素的枚举类型经常成为实现 Singleton 的最佳方法

看完段想到的在平时用到这个的就是 Enum 了吧

package com.xxx.xx.xx.enums;public enum NameListTypeEnum {BLACKNAMELIST("1", "黑名单"),WHITENAMELIST("2", "白名单"),GRAYNAMELIST("3", "灰名单");private String code;private String name;NameListTypeEnum(String code, String name) {this.code = code;this.name = name;}public static boolean validateCode(String code) {for (NameListTypeEnum nameListTypeEnum : values()) {if (nameListTypeEnum.getCode().equals(code)) return true;}return false;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

View Code

2.4通过私有构造器强化不可实例化的能力

通过将一些工具类做成抽象类强制该类不可被实例化是行不通的 解决办法是让该类包含一个私有构造器 这样就不会被实例化

public class UtilityClass {public UtilityClass() {throw new AssertionError();}
} 

View Code

useful java utility class

2.5优先考虑依赖注入来引用资源

静态工具类和 Singleton 不适合于需要引用底层资源的类 当创建一个新的实例时 就将该资源传到构造器中 (这是依赖注入的一种形式)

2.6避免创建不必要的对象

自动装箱(另一种创建多余对象的方法)使得基本类型和装箱基本类型之间的差别变得模糊起来 但是没有完全消除 要优先使用基本类型而不是装箱基本类型 要当心无意识的自动装箱

2.7消除过期对象的引用

内存泄漏的来源:1.自己管理内存不当造成内存泄漏;2.缓存;3.监听器和其他回调

2.8避免使用终结方法和清除方法

终结方法通常是不可预测的 也是很危险的 一般情况是不必要的;清除方法没有终结方法那么危险但仍然是不可预测的 运行缓慢 一般情况也是不必要的 注重时间的任务不该由终结方法或者清除方法来完成

转载于:https://www.cnblogs.com/zlrrrr/p/11311854.html

《Effective Java》 读书笔记(持续更新)相关推荐

  1. Effective Java读书笔记(二)

    Effective Java 读书笔记 (二) 创建和销毁对象 遇到多个构造器参数时要考虑使用构建器 创建和销毁对象 何时以及如何创建对象? 何时以及如何避免创建对象? 如何确保它们能够适时地销毁? ...

  2. Effective Java 读书笔记(七):通用程序设计

    Effective Java 读书笔记七通用程序设计 将局部变量的作用域最小化 for-each 循环优于传统的 for 循环 了解和使用类库 如果需要精确的答案请避免使用 float 和 doubl ...

  3. Effective Java 读书笔记(一)

    前言: 开个新的坑位,<effective java>的读书笔记,之后有时间会陆陆续续的更新,读这本书真的感触满多,item01和item02就已经在公司的项目代码中看到过了.今天这篇主要 ...

  4. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  5. Effective Java读书笔记七:泛型(部分章节需要重读)

    第23条:请不要在新代码中使用原生态类型 从java1.5发行版本开始,Java就提供了一种安全的替代方法,称作无限制的通配符类型,如果要使用范型,但是确定或者不关心实际的参数类型,就可以用一个问号代 ...

  6. Effective Java读书笔记六:方法

    第38条:检查参数的有效性 绝大多数方法和构造器对于传递给它们的参数值都会有些限制.比如,索引值必须大于等于0,且不能超过其最大值,对象不能为null等.这样就可以在导致错误的源头将错误捕获,从而避免 ...

  7. Effective Java读书笔记五:异常

    第57条:只针对异常的情况才使用异常 异常是为了在异常情况下使用而设计的,不要将它们用于普通的控制流,也不要编写迫使它们这么做的API. 下面部分来自:异常 如果finally块中出现了异常没有捕获或 ...

  8. Effective Java读书笔记四:通用程序设计

    第45条:将局部变量的作用域最小化 在第一次使用变量时的地方声明: 几乎每个局部变量的声明都应该包含一个初始表达式: 如果在终止循环之后不需要循环变量的内容,for循环优于while循环.(for循环 ...

  9. Effective Java读书笔记三:创建和销毁对象

    第1条:考虑用静态工厂方法代替构造器 对于类而言,为了让客服端获得它的一个实例最常用的的一个方法就是提供一个公有的构造器.还有一种方法,类可以提供一个公有的静态工厂方法(static factory ...

  10. Effective Java读书笔记二:枚举和注解

    第30条:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 第31条:用实例域代替序数 枚举的ord ...

最新文章

  1. linux grep 快速,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  2. 初学Java Web开发,请远离各种框架,从Servlet开发
  3. 为什么有的项目不能打断点_《街霸:对决》:有效利用“打断”机制,让玩家在战斗中越级战斗...
  4. 201421440008网络攻防实验三
  5. 零压力学python_《零压力学Python》 之 第一章知识点归纳
  6. count 有条件 mysql_mysql 不同条件count ,多条件count()
  7. 面向对象编程,链式调用,先输出‘hello’,10秒之后,输出‘world’
  8. 大学物理质点动力学思维导图_生理学 | 思维导图
  9. android 4.4 屏幕方向,Android4.4屏幕旋转功能
  10. Java创建对象详解
  11. C++ 单元测试框架 Boost Test BOOST_AUTO_TEST_CASE
  12. ajax表单提交post(错误400) 序列化表单(post表单转换json(序列化))
  13. VMware 共享目录不显示的解决办法
  14. 20220522Python3.10安装教程
  15. 安装音量控制程序 WINDOWS
  16. 炼石:栉风沐雨七载路,不负韶华再出发
  17. 适合学生党上手测试的免费云服务器推荐
  18. 软件 -- 如何解除 tv15商业版的限制
  19. 【产品经理三节课】第4章 产品调研入门
  20. 计算机网络密码凭据,网络访问: 不允许存储网络身份验证的密码和凭据

热门文章

  1. Redhat下的软件安装 RPM包管理工具介绍
  2. C语言的设计模式-接口隔离
  3. matlab 最小一乘法,MATLAB实现最小二乘法
  4. 不懂编程可以自学python吗-会Python的人工作不会太差?编程课真的有必要学吗?...
  5. python爬虫教程视频下载-利用Python网络爬虫获取电影天堂视频下载链接【详细教程】...
  6. python读文件写文件-python 文件读写操作
  7. 学python有哪些书推荐-Python 有哪些入门学习方法和值得推荐的经典教材?
  8. 用requests获取网页源代码 python-手把手教你利用爬虫爬网页(Python代码)
  9. python面试-Python面试
  10. python微控制器编程从零开始-单片机可以使用Python语言来控制了!