参考资料:<Effective Java>.<Java核心技术 卷1>.https://www.cnblogs.com/zhaosq/p/10135362.html 基础回顾 1.什么是枚举? 有时候一个变量的取值只在一个有限的集合内,比如衣服的大小,就可以用到枚举. //自定义枚举类型 enum Size {S,M,L,X}; //声明Size类型的变量 Size size=Size.M 枚举类型只是存储这个枚举指定的变量,如上面的size只能是S,M,L,X. 实际上,enum…
Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统.使类成为Singleton会使它的客户端测试变得十分困难,因为无法给Singleton替换模拟实现,除非它实现一个充当其类型的接口. 在Java 1.5发行版本之前,实现Singleton有两种方法. 第一种方法,公有静态成员是个final域: public class Elvis { public static final Elvis INSTANCE = new E…
  Singleton指仅仅被实例化一次的类 [Gamma95].Singleton通常代表无状态的对象,例如函数(第24项)或者本质上唯一的系统组件.使类称为Singleton会使它的客户端测试变得十分困难,因为除非它实现了作为其类型的接口,否则不可能将模拟实现替换为单例.   实现单例的方法有两种. 两者都基于保持构造函数私有并导出公共静态成员以提供对唯一实例的访问. 在一种方法中,该成员是final字段: // Singleton with public final field publi…
1.Singleton指仅仅被实例化一次的类.Singleton通常被用来代表那些本质上唯一的系统组件,如窗口管理器或者文件系统.使类称为Singleton会使它的客户端调试变的十分困难,因为无法给Singleton替换模拟实现,除非它实现一个充当其类型的接口.     2.在Java1.5发行版本之前,实现Singleton有两种方法.这两种方法都要把构造器保持为私有,并导出公有的静态成员,以便客户端能够访问该类的唯一实例,以便允许client能够访问该类的唯一实例.     3.第一种方法中…
Singleton指只被实例化一次的类.一般用来搞那些创建很耗资源或者要求系统中只能有一个实例的类. 这个很经常使用.记得曾经实习面试的时候就有这个面试题. 一般採用的方法是将构造器私有化,然后提供一个static变量,再提供一个static的public方法用来返回static实例: //Singleton with static factory public class Elvis { private static final Elvis INSTANCE = new Elvis(); pr…
实现Singleton(代表本质上唯一的系统组件)的三种方法: 1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例. 2. 保持私有构造器,公有的成员是静态工厂方法. 3. 单元素的枚举类型已经成为实现Singleton的最佳方法. 前两种方法有两点注意: 1. 享有特权的客户端可以通过反射机制调用私有构造器.如果需要抵御这种攻击,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常. 2. 如果要使其变成可序列化的,需要: (1) implement Serializabl…
Singleton是指仅仅被实例化一次的类.通过被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统. 在http://www.cnblogs.com/13jhzeng/p/5256424.html中,提到了不同情境下Singleton多种实现方法. 使用单例类的方法来实现的Singleton在让其变成可序列化(Serializable)时,仅仅在声明上加上“implements Serializable”是不够的,为了维护并保证Singleton,必须声明所有实例域都是transie…
Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法: 1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObject.setAccessible方法,通过反射机制调用私有构造器. public class User{ public static final User INSTANCE = new User(); private User{ } public void doSomeThing(){...} }…
1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public String getField() { return field; } public void setField(String field) { this.field = field; } public void leaveTheBuilding(){ System.out.println("Sin…
Singleton指只有一个实例的类,只能被创建一次. 在Java1.5之前实现Singleton有两种方式,都是将构造器设为private并导出公有的静态成员实例. 第一种方式将公有的静态成员实例设为final: public class Singleton { public static final Singleton INSTANCE = new Singleton(); private Singleton() {} } 私有构造器仅被调用一次,用来实例化公有的静态final属性INSTA…
单例(singleton)就是一个只实例化一次的类.使类成为单例可能会使它的测试变得困难,因为除非它实现了作为其类型的接口,否则不可能用模拟实现来代替这个单例.下面是几种实现单例的方法: 1.共有静态成员是final类型 // Singleton with public final field public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } } 私有构造器…
1.5版本之前,我们通常实现单例模式有两种方式: 两种方法前提都是私有化构造器,然后通过不同的方式获取对象. 第一种:通过公共的静态变量获取 public class Elivs{ // 私有化构造器 private Elivs(){} // 通过静态私有变量保存对象 public static final Elivs INSTANCE = new Elivs(); } 第二种:通过静态方法获取 public class Elivs{ // 私有化构造器 private Elivs(){} //…
参考Effective Java第三版 Joshua J. Bloch 参与编写JDK的大佬,上次看Collections的源码时看见了他的名字,然后翻了翻书,竟然就是他写的! 1.常见的一种: public class Singleton { private static final Singleton INSTANCE=new Singleton(); private Singleton(){ //如果没有判断,可以通过反射使用构造函数创建对象,然后就不是单例了 if (INSTANCE!=…
使用是由构造器或枚举类型强化singleton 普通singleton:借助AccessibleObject.setAssess方法,通过反射机制调用私有构造器.抵御这种攻击可以修改构造器,让其再被要求创建第二个实例的时候抛出异常 //允许创建一个实例,当通过反射调用private 构造方法时,抛出异常组织创建 public static StrongSingletonByConstr getInstance(){ return SSBC;//公有域方法 } 公有域方法的特点:组成类的成员的声明…
本文参考 本篇文章参考自<Effective Java>第三版第三条"Enforce the singleton property with a private constructor or an enum type" 原文的不足之处 原文给的示例代码比较简单,提供的是一种饿汉式的单例模式 // Singleton with public final field public class Elvis {     public static final Elvis INSTA…
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 通过私有构造器强化不可实例化的能力 第5条 避免创建不必要的对象 第6条 消除过期的对象引用 第7条 避免使用终结方法 第1条 考虑用静态工厂方法代替构造器 对于类而言, 最常用的获取实例的方法就是提供一个公有的构造器, 还有一种方法, 就是提供一个公有的静态工厂方法(static factory…
本篇主要总结的是<Effecticve Java>中关于创建和销毁对象的内容. 比如: 何时以及如何创建对象 何时以及如何避免创建对象 如何确保及时销毁 如何管理对象销毁前的清理动作 考虑用静态工厂方法代替构造器 使用静态工厂的优势: 有名称 不必每次调用的时候都创建一个新的对象 返回原返回类型的任何子类型对象 在创建参数化类型实例时,代码更加简洁. 使用静态工厂的缺点: 类如果不包含公有的或者受保护的构造器,就不能被子类化 与其他的静态方法实际上没有任何区别 举个例子: public cla…
第二章 创建和销毁对象 1.考虑用静态工厂方法代替构造器 四大优势: i. 有名称 ii. 不必在每次调用它们的时候都创建一个新的对象:   iii. 可以返回原返回类型的任何子类型的对象: JDBC(Java Database Connectivity) 服务提供者框架(Service Provider Framework) 服务接口.提供者注册API.服务访问API.服务提供者接口(负责创建其服务实现的实例): iv. 在创建参数类型实例的对象,它们使代码变得更加简洁 下面是一个Boolea…
前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 获取类的实例的常用方法有: 1.公有的构造器 2.公有的静态工厂方法 下面通过Boolean类(基本类型boolean的包装类)的简单示例来学习: //公有的构造器 public Boolean(String s) { this(parseBoolean(s)); } //公有的静态工厂方法 pub…
目录 第1条:考虑使用静态工厂方法代替构造器 第2条:遇到多个构造器参数时考虑用构建器 第3条:用私有构造器或者枚举类型强化Singleton属性 第4条:通过私有构造器强化不可实例化的能力 第5条:避免创建不必要的对象 第6条:消除过期的对象引用 第7条:避免使用终结方法 第2章 创建和销毁对象 第1条:考虑使用静态工厂方法代替构造器 通过使用静态工厂方法而不是使用构造器来创建类. 举例:Boolean.valueOf(boolean)方法,将boolean转换为Boolean对象引用. 有以…
最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的笔记,所以大部分内容基本来自此书,还有一小部分是自己的理解. 第1条 考虑用静态工厂方法代替构造器 一般来说,获取一个类的实例,大家想到的都是通过该类的公有构造函数来new 一个实例,而第一条推荐我们可以考虑使用静态工厂方法来创建实例,这里的工厂方法并不直接对应于设计模式中的工厂方法模式. 静态工厂方法与构造…
最近有在看Effective Java,特此记录下自己所体会到的东西,写篇博文会更加的加深印象,如有理解有误的地方,希望不吝赐教. 这章主题主要是介绍:何时以及如何创建对象,何时以及如何避免创建对象,如何确保他们能够适时的销毁,以及如何管理对象销毁之前必须进行的清理动作.下面我会根据书中内容+例子总结: 一.考虑用静态工厂方法代替构造器(体现了如何创建对象.避免创建对象) 如何获取一个类的实例,最常用的方法就是提供一个共有的构造器, 但是还有一种方法就是使用静态工厂方法(与设计模式中的工厂方法不…
[Effective Java] 创建和销毁对象篇 1. 优先考虑用静态工厂方法代替构造器 优点: - 静态工厂方法相比于构造器,它们有名称 - 不需要每次在使用的时候创建一个对象 - 可以返回原返回类型的任何子类型的对象 - 在创建参数化是来的时候,代码更加简洁 缺点: - 不能被子类化(因为鼓励程序使用复合,而不是继承) - 与其他的静态方法实际上没有任何区别(想要查明如何实例化一个类比较困难) 常用静态工厂方法名称: - valueOf(类型转换方法) - of - getInstance…
1.考虑用静态工厂方法代替构造器 类的一个实例,通常使用类的公有的构造方法获取.也可以为类提供一个公有的静态工厂方法(不是设计模式中的工厂模式)来返回类的一个实例.例如: //将boolean类型转换为Boolean类型 public static valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 使用静态工厂方法代替构造器的优势: 静态工厂方法有名称,更易读.静态工厂方法能够使用方法名称进行自注释,来描述被返回的对象…
Num1:考虑用静态工厂方法代替构造器 对于类而言,常见的方法是提供一个公有的构造器,但其实还有一种方法叫做静态工厂方法(static factory method),它只是一个返回类的实例静态方法. 目前比较流行的规范是把静态工厂方法命名为valueOf或者getInstance. valueOf:该方法返回的实例与它的参数具有同样的值,例如: Integer a=Integer.valueOf(100); //返回取值为100的Integer对象 从上面代码可以看出,valueOf()方法能…
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: 1.静态工厂方法有名称:通过有意义的静态工厂方法名称可以很好的表达工厂方法的作用,易于区别功能相似的多个静态工厂方法. 2.静态工厂方法可以有更复杂的生产对象逻辑,不仅仅是新建一个对象:既可以新建一个对象,也可以使用缓存的对象. 3.静态工厂方法可以返回原返回类型的任何子类型的对象:由于接口不能有…
一.考虑用静态工厂方法代替构造器 1.此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法. 2.静态工厂方法的优势有: a.使用不同的方法名称可显著地表明两个静态工厂方法的不同,而不像构造器,名字只能是类名. b.并不是每次调用静态工厂方法,都会重新构造一个新的对象. c.可以返回类型的子类型的对象. d.创建参数化类型的实例时,代码变得简洁了. 3.静态工厂方法的缺点有: a.类如果不含有公有的或者受保护的构造器,就不能被子类化(静态工厂方法的存在导致构造器存在的…
背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优点 静态工厂方法与构造器不同的第一大优势在于,他们有名称,比多个通过不同参数的构造器更具有辨识度. 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用他们的时候都创建一个新对象. 静态工厂方法与构造器不同的第三大优势在于,他可以返回原返回类型的任何子类型的对象 服务提供者框架. ```java…
在这里记录<Effective Java>学习笔记.该书介绍了java编程中70多种极具实用价值的经验规则,揭示了该做什么,不该做什么才能产生清晰.健壮和高效的代码. 第1条: 考虑用静态工厂方法代替构造器 对于类而言,为了让客户端获得它自身的实例,最常用的方法就是提供一个公有的构造器.还有一种方法就是提供一个静态工厂方法.下面是Boolean的一个简单示例. public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE…
一 .考虑用静态工厂方法代替构造器 1. 静态工厂方法与设计模式中的工厂方法模式不同,注意不要混淆 例子: public static Boolean valueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; } 2. 采用静态工厂方法比构造器方法的优势 ①有名称 ② 不必在每次调用他们的时候都创建一个新的对象 ③可以返回原类型的任何子类型的对象 ④在创建参数化实例的时候,使代码更加简洁 比如 Map<String,List<St…