获取类的实例有两种方法: 1. 提供一个公有的构造器(最常用). 2. 提供一个公有的静态工厂方法(static factory method). // 静态工厂方法示例 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 静态工厂方法的优势: 1. 有名称.当一个类需要多个带有相同签名(方法签名 = 方法名 + 参数列表)的构造器时,就用静态工厂方法代替构造器,并且慎重选择名…
传统的方式获取一个类的实例,是通过提供一个 public 构造器.这里有技巧,每一个程序员应该记住.一个类可以对外提供一个 public 的 静态工厂方法 ,该方法只是一个朴素的静态方法,不需要有太多复杂的逻辑,只需要返回该类的实例. 这里通过 Boolean (是原始类型 boolean 的包装类)举一个简单的例子: public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 这个方…
前言 系列文章:[传送门]   每次开始新的一本书,我都会很开心.新书新心情. 正文 静态工厂方法代替构造器 说起这个,好多可以念叨的.做了一年多的项目,慢慢也有感触. 说起构造器 大家很明白,构造器可以让我们在何处何地获取自身或者他人一个实例.我们是无忌惮的使用着 new 却从来没考虑过人家的感受.其实new ,new一个对象,就是开辟一块内存空间给这个对象.如果何处何地,都new的话,漫山遍野... 五颜六色的new ,本质却一样 一句话:构造器虽是万能,但是要珍惜. 再谈谈 静态工厂方法…
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文<java中final与static的使用场景总结>. 什么是静态工厂方法? 可以参考书中的例子(摘自JDK1.7 java.lang.Boolean) public final class Boolean implements java.io.Serializable, Comparable<…
类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } 优势: 1.有名称.当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并慎重选择名称以突出它们之间的区别. 如:BigInteger.probablePrime(int bitLength, Random rnd) 返回一个随机的素数. 2.不…
对于类而言,为了让client获取它自身的一个实例,最经常使用的方法就是提供一个共同拥有的构造器. 另一种放你发,也应该子每一个程序猿的工具箱中占有一席之地.类能够提供一个共同拥有的静态 工厂方法.它仅仅是返回类的实例的静态方法. 类能够通过静态工厂方法类提供它的client(对象),而不是通过构造器.提这样做的优点有: 1.静态工厂方法与构造器不同的第一大优势在于.它们有名称.比方构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,假设用名为BigI…
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.JVM.分布式之类的.在今年面试的时候深受打击,到处都是问分布式.集群的?难道现在工作两三年的都这么牛逼了?都在搞分布式.集群之类的? 2016书单如下: 1.深入理解Java虚拟机:JVM高级特性与最佳实践---(已看,预计今年看三遍) 2.Oracle查询优化改写技巧与案例---(已看) 3.Ef…
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: 1.静态工厂方法有名称:通过有意义的静态工厂方法名称可以很好的表达工厂方法的作用,易于区别功能相似的多个静态工厂方法. 2.静态工厂方法可以有更复杂的生产对象逻辑,不仅仅是新建一个对象:既可以新建一个对象,也可以使用缓存的对象. 3.静态工厂方法可以返回原返回类型的任何子类型的对象:由于接口不能有…
第四条:通过私有构造器强化不可实例化的能力 有时可能需要编写只包含静态方法和静态域的类,这样的工具类不希望被实例化,因为实例化对它来说没有意义. 然而,在缺少显式构造器的情况下,系统会自动提供一个缺省构造,但这种类又不能设计为抽象类,因为它不希望被继承,也不希望它的子类能实例化. 所以,可以为其提供一个显式的私有构造器,保证不能从类的外部调用构造,代码如下: public class UtilityClass{ private UtilityClass(){ throw new Assertio…
创建和销毁对象 >考虑用静态工厂方法替代构造器. 优点: ●优势在于有名称. ●不必再每次调用他们的时候都创建一个新的对象. ●可以返回原返回类型的任何子类型的对象. ●在创建参数化类型实例的时候,他们使代码更加简洁. 缺点: ●类如果不含公有的或者受保护的构造器.就不能被子类化. ●他们与其他的静态方法没有任何区别. >遇到多个构造器参数的时候考虑用构建器. >用私有的构造器或者枚举类型强化Singleton属性. >通过私有构造器强化不可实例化的能力. >避免创建不必要的…
第二章  创建和销毁对象 第一条 使用静态工厂方法替代构造器,原因: 静态工厂方法可以有不同的名字,也就是说,构造器只能通过参数的不同来区分不同的目的,静态工厂在名字上就能表达不同的目的 静态工厂方法不用每次调用的时候都创建新的对象(其实是因为它是static的,所以只能用static的,所以是一早就创建了,不需要重复创建吧..),比如书中 Boolean.valueOf(boolean) public static final Boolean TRUE = new Boolean(true);…
1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build()3.用私有构造器或者枚举类型强化Singleton属性.单例:无状态.实现单例如果实现序列化接口,可能会在序列化和反序列化导致有多个实例产生.枚举的实现方法可以解决,但是枚举不太好去继承.枚举是目前最佳实现单例的方法.4.通过私有构造器强化不可实例化的能力5.优先考虑依赖注入来引用资源.资源都是单例…
Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静态工厂方法有以下几大优势. 优势1.静态工厂方法的名称,因此比构造器更准确地描述返回的实例. 比如BigInteger.probablePrime方法: public static BigInteger probablePrime(int bitLength, Random rnd) { if (b…
程序员这行干的久了,总会染上一些恶习,我就染上一个让人深恶痛绝,自己却津津乐道的习惯,还不想改的那种,它可以叫做强迫症,也可以叫做洁癖.那就是我不允许我的IDEA出现一点点警告,什么黄色背景,绿色波浪线,统统不允许,按下F2键必须是这样 当然,说这些也没有意义,因为并没有说如何去做,所以今天我准备开一个新的系列--如何写出高效清爽的Java代码,这意味着这整个系列的所有案例都会十分严谨且苛刻.如果有小伙伴说:这一丁点性能有什么嘛,无所谓啦.我:不,一丁点也不允许! 高效:开发高效,性能高效 今天…
我之前已经介绍过关于构建者模式(Builder Pattern)的一些内容,它是一种很有用的模式用于实例化包含几个属性(可选的)的类,带来的好处是更容易读.写及维护客户端代码.今天,我将继续介绍对象创建技术. 在我看来,下面这个类是非常有用的例子.有一个RandomIntGenerator 类,产生随机的int类型的整数.如下所示: public class RandomIntGenerator { private final int min; private final int max; pu…
用静态工厂方法来代替构造器为外界提供对象 描述: 静态工厂方法代替构造器来给外界提供对象,创建对象依然是由构造器来完成的 创建对象和提供对象: 创建对象的方式: 构造器 提供对象来哦方式: 构造器 类中公有的静态方法 一般在使用静态工厂方法时,会根据方法的需要提供private的构造器 静态方法=类方法 因为需要类来调用,所以需要static 用途(优点): 有便于分辨的名字 解释: 构造器和类同名,当存在多个构造器时,用户不便分辨各个构造器的作用 静态工厂方法可以根据功能自定义方法名 tips…
本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructors" 另外参考了其它几篇文章的解读: https://www.cnblogs.com/dyj-blog/p/8867028.html https://blog.csdn.net/u014129886/article/details/89670049 前言 第一条的篇章来自"Creating…
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验. 第1条:用静态工厂代替构造函数 1. 形式 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 2. 优点: 可以有名称 不一定要创建新对象,可以返回已有的对象 可以返回子类类…
1 最小化类和成员的可访问性 (1)封装 封装对组成系统的组件进行解耦,从而允许这些组件独立开发,测试,优化,使用,理解和修改. 封装提高了软件的复用性,因为组件间的耦合度低使得它们不仅在开发环境,而且在别的环境也能变得有用. 封装降低了开发大型系统的风险,因为即使系统不可用了,但这些独立的组件却有可能仍可用. (2)对于成员(域,方法,嵌套类,或者嵌套接口),都有四种可能的访问级别 private:成员只能被声明它的顶级类访问. default:成员可以被声明它的包下面的所有类访问. prot…
1.使类和成员的可访问性最小化不指定访问级别,就是包私有.protected = 包私有 + 子类一般private不会被访问到,如果实现了Serializable,可能会泄露.反射.final集合或者数组,可以返回clone或者使用unmodifiableList等.java新增2种隐式访问级别,作为模块系统的一部分.一个模块就是一组包.模块内部,可访问性不受导出声明影响,模块中未被到导出的包在模块之外是不可访问的.2.要在公有类而非公有域中使用访问方法如果类可以在它所在的包之外进行访问,就提…
一.使类和成员的可访问性最小化 1.尽可能地使每个类或者成员不被外界访问. 2.实例域决不能是共有的.包含公有可变域的类不是线程安全的. 3.除了公有静态final域的特殊情形之外,公有类都不应该包含公有域,并且确保公有静态final域所引用的对象不可变. 二.在公有类中使用访问方法而非公有域 1.如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误. 2.公有类永远都不应该暴露可变的域. 三.使可变性最小化 不可变的类是指其实例不能被修改的类.为使类不可变,需要遵循以下五…
1 构造器 => 静态工厂方法 (1)优势 静态工厂方法有名字 静态工厂方法不必在每次被调用时都产生一个新的对象 静态工厂方法能返回原返回类型的任意子类型的对象 静态工厂方法根据调用时传入的不同参数而返回不同类的对象 静态工厂方法返回对象的类不需要存在(SPI架构) (2)限制 没有公有或者保护构造方法的类不能子类化(但是可以鼓励我们使用组合模式,而不是继承模式) 静态工厂方法难以发现 (3)常用静态工厂方法命名 from:传入单个参数,返回该类型实例 Date d = Date.from(in…
第五条 避免创建不必要的对象 书中一开始举例: String s = new String("stringette"); // don't do this //应该使用下面,只会创建一次实例 String s = "stringette"; 同时书中回顾了第一条中的静态工厂,即Boolean.valueOf(String)的例子,即静态工厂方法也不会每次都创建实例 然后用一个Date对象的使用的例子,说明了,当一个方法要重复访问固定值的对象实例时,可以用static…
静态工厂方法的优点: 可以赋予一个具有明确含义的名称 可以复用唯一实例,不必每次新建 可以返回原实例类型的子类对象 可以在返回泛型实例时更加简洁 缺点: 类如果不含有共有的或者受保护的构造器,就不能被子类化? 无法通过文档明确了解该方法具体体的实例化流程…
摘自<<Java 8 实战>> Collectors 类的静态工厂方法 工厂方法 返回类型 用于 toList List<T>  把流中所有项目收集到一个 List 使用示例: List<Dish> dishes = menuStream.collect(toList()); toSet Set<T> 把流中所有项目收集到一个 Set ,删除重复项 使用示例: Set<Dish> dishes = menuStream.collect…
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. Background 看了历史, 写第一篇笔记居然是2016年的事情了, 中间半途而废搁置了好长时间, 去年生病的时候捡起来看了一些, 今年终于看完了. 做这个笔记的目的主要是为了个人学习, 把一本书读薄, 也留下以后可以查阅翻阅的资料. 写博客这么多年, 我觉得有一个很大的好处是, 有时候会有一个…
1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); 上述使用了策略模式,Comparator接口为排序的抽象策略,匿名内部类为具体实现策略,但是匿名内部类的实现过于冗长. 在java…
泛型的本质是参数化类型.只对编译器有效. 一.请不要在新代码中使用原生态类型 1.泛型类和接口统称为泛型,有一个对应的原生态类型. 2.原生类型的存在是为了移植兼容性. 3.无限制通配类型和原生态类型的区别是:通配符类型是安全的,原生态类型不安全.你可以将任何元素放入到原生态类型的集合中,但不能将除了null之外的其他任何元素放到Collection<?>中. 4.两条例外: a.在Class中只能使用原生态类型,因为泛型信息可以在运行时被擦除. b.在操作instanceof时,使用参数化类…
第二十条 用函数对象表示策略 函数指针(JAVA的函数指针,是指使用对象的引用来作为参数,传递给另一个对象的方法)主要用来实现策略模式,为了在JAVA中实现这种模式,要申明一个接口来表示该策略,并为每个具体策略申明一个实现了该接口的类. 如果这个策略只被执行一次,使用匿名类,如果重复使用,则通常实现为私有的静态成员类,并通过共有的静态final域导出(最后一个例子),其类型为该策略接口. 第二十一条 优先考虑静态成员类 嵌套类主要有四种:静态成员类,非静态成员类,匿名类,局部类 静态成员类,一般…
第十三条 使类和成员的可访问性最小化 总得来说,我们应该尽量将成员的访问范围限制到最小!有利于解耦,开发.测试和优化都能够更加独立. 对于成员(域,方法,嵌套类和嵌套接口),有四种可能的访问级别,访问范围从小到大: 访问控制符 同类 同包子类  同包其它类 不同包子类 不同包其它类 public √ √ √ √ √ protected √ √ √ √ × 默认 √ √ √ × × private √ × × × × 另外,JAVA中的常量是全局访问的,public static final In…