对于类而言,为了让client获取它自身的一个实例,最经常使用的方法就是提供一个共同拥有的构造器. 另一种放你发,也应该子每一个程序猿的工具箱中占有一席之地.类能够提供一个共同拥有的静态 工厂方法.它仅仅是返回类的实例的静态方法. 类能够通过静态工厂方法类提供它的client(对象),而不是通过构造器.提这样做的优点有: 1.静态工厂方法与构造器不同的第一大优势在于.它们有名称.比方构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,假设用名为BigI…
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文<java中final与static的使用场景总结>. 什么是静态工厂方法? 可以参考书中的例子(摘自JDK1.7 java.lang.Boolean) public final class Boolean implements java.io.Serializable, Comparable<…
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 条目1. 考虑使用静态工厂方法替代构造方法 一个类允许客户端获取其实例的传统方式是提供一个公共构造方法. 其实还有另一种技术应该成为每个程序员工具箱的一部分. 一个类可以提…
传统的方式获取一个类的实例,是通过提供一个 public 构造器.这里有技巧,每一个程序员应该记住.一个类可以对外提供一个 public 的 静态工厂方法 ,该方法只是一个朴素的静态方法,不需要有太多复杂的逻辑,只需要返回该类的实例. 这里通过 Boolean (是原始类型 boolean 的包装类)举一个简单的例子: public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 这个方…
前言 系列文章:[传送门]   每次开始新的一本书,我都会很开心.新书新心情. 正文 静态工厂方法代替构造器 说起这个,好多可以念叨的.做了一年多的项目,慢慢也有感触. 说起构造器 大家很明白,构造器可以让我们在何处何地获取自身或者他人一个实例.我们是无忌惮的使用着 new 却从来没考虑过人家的感受.其实new ,new一个对象,就是开辟一块内存空间给这个对象.如果何处何地,都new的话,漫山遍野... 五颜六色的new ,本质却一样 一句话:构造器虽是万能,但是要珍惜. 再谈谈 静态工厂方法…
Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静态工厂方法有以下几大优势. 优势1.静态工厂方法的名称,因此比构造器更准确地描述返回的实例. 比如BigInteger.probablePrime方法: public static BigInteger probablePrime(int bitLength, Random rnd) { if (b…
程序员这行干的久了,总会染上一些恶习,我就染上一个让人深恶痛绝,自己却津津乐道的习惯,还不想改的那种,它可以叫做强迫症,也可以叫做洁癖.那就是我不允许我的IDEA出现一点点警告,什么黄色背景,绿色波浪线,统统不允许,按下F2键必须是这样 当然,说这些也没有意义,因为并没有说如何去做,所以今天我准备开一个新的系列--如何写出高效清爽的Java代码,这意味着这整个系列的所有案例都会十分严谨且苛刻.如果有小伙伴说:这一丁点性能有什么嘛,无所谓啦.我:不,一丁点也不允许! 高效:开发高效,性能高效 今天…
本文参考 本篇文章参考自<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…
避免使用终结方法(finalizer) 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的. 不要把finalizer当成C++中析构函数的对应物.java中,当对象不可达时(即没有引用指向这个对象时),会由垃圾回收器来回收与该对象相关联的内存资源:而其他的内存资源,则一般由try-finally代码块来完成类似的工作. 一.finalizer的缺点: 1. 终结方法的缺点在于不能保证会被及时地执行. 及时执行finalizer方法是JVM垃圾回收方法的一个主要功…
第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定. 首先看看equals方法: 若满足以下的这些情况中的某一个,您能够直接使用Object类中的equals方法而不用覆盖: 类的每个实例本质上是唯一的.对于那些代表实例而不是值的类来说能够不用覆盖equals方法.比方Thread类.由于每个Thread类的实例都表示一个线程,这与Thread某些…