一、 考虑用静态工厂方法代替构造器:

1)静态工厂方法与构造器不同的第一大优势在于:他们有名称。当一个类需要多个带有相同签名的构造器时,就用静态方法代替构造器,并慎重的选择名称以突出他们间的区别;

2)静态工厂方法第二大优势: 不必在每次调用他们的时候都创建一个新对象;

3)静态工厂方法第三大优势: 他们可以返回原返回类型的任何子类型的对象;

4)静态工厂方法第四大优势: 在创建参数化类型实例的时候,他们使代码变得更整洁;

5)静态工厂方法缺点一:类如果不含公共的或者受保护的构造器,就不能被子类化;

6)静态工厂方法缺点二:他们与其他的静态方法没有任何区别;

二、 遇到多个构造器参数时要考虑用构建器:

1)第一种方式----重叠构造器:第一个构造器只有必要参数,第二个有一个可选参数,第三个有两个可选参数......最后一个包含所有可选参数。要创建实例的时候,就利用参数列表最短的构造器,但该列表中包含了要设置的所有参数(缺点在于当有许多参数时,客户端代码会很难写,并且仍然难以阅读)

2)第二种方法----JavaBeans模式:调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的必选参数。
(由于构造过程被分到了几个调用中,在构造过程中JavaBean可能存在不一致的状态,线程安全存在隐患)

3)Builder模式:不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或静态工厂),得到一个builder对象,然后客户端在builder对象上调用类似setter的方法来设置每个相关的可选参数,最后客户端调用午餐的build方法类生成不可变的对象。newInstance方法总是企图调用类的无参构造器,还会传播由无参构造器抛出的任何异常。

三、用私有构造器或者枚举类型强化Singleton属性:
Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法:

(1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObject.setAccessible方法,通过反射机制调用私有构造器:

public class User{
public static final User INSTANCE = new User();
private User{
}
public void doSomeThing(){...}
}

(2)公有静态成员是个静态工厂方法:

public class User{
public static final User INSTANCE = new User();
private User{
}
public static User getInstance(){ return INSTANCE;}
public void doSomeThing(){...}
}

(3)单个元素的枚举类型:

public enum User{
INSTANCE;
public void doSomeThing(){...}
}

  

 

Effective Java 之-----静态工厂与构造器的更多相关文章

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

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

  2. Effective Java第三版(一) ——用静态工厂代替构造器

    此文做为<Effective Java>系列的第一篇,所以有必要大概说下此书的特点,当然很多人可能都看过,毕竟是有着Java四大名著之一的大名在外,不过总会有萌新不了解,例如我!<E ...

  3. 读Effective Java笔记之one:static Factory methods instead of Constructors (静态工厂方与构造器)

    获取类的实例的方法有很多种,在这很多种方法中,它们各有优缺,各有特点.这里,只介绍2中方法 1.使用构造方法 public class Person { private String sex; /** ...

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

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

  5. Java 的静态工厂方法

    本文转载自:https://www.jianshu.com/p/ceb5ec8f1174 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器不同的第一优势在于,它们有名 ...

  6. 解析《Effective Java》之多个构造器、Javabeans模式和Builder模式

    最近看<Effective Java>这本被很多同行称为神作的书,但是这本书很多地方缺少了举例不好懂,下面是关于我对书上知识的理解. 一.<Effective Java>中文版 ...

  7. Java设计模式———静态工厂

    上课时yqj2065要求:除了JDK等框架或工具中的类,自己编写的类不得使用new创建对象(Test除外). 据说是因为使用new会涉及到硬编码.(不是很懂) 所以要求用God类利用反射+配置文件来创 ...

  8. 【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性

    实现Singleton(代表本质上唯一的系统组件)的三种方法: 1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例. 2. 保持私有构造器,公有的成员是静态工厂方法. 3. 单元素的枚 ...

  9. 【读书笔记 - Effective Java】04. 通过私有构造器强化不可实例化的能力

    工具类(utility class)不希望被实例化,比如只包含静态方法和静态域的类.为了这个目的,需要让这个类包含一个私有构造器. // 私有构造器示例 public class UtilityCla ...

随机推荐

  1. CSRF跨站

    跨站请求伪造: 简单的说跨站请求伪造就是一些恶意的用户用自己的表单伪造网页实际的表单发送数据,接下来我就随便写一点: 跨站伪造的产生(form表单的methoud只有在等于post的时候才会有可能发生 ...

  2. Jfinal启动源码解读

    本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口  JF ...

  3. cs231n spring 2017 lecture3 Loss Functions and Optimization 听课笔记

    1. Loss function是用来量化评估当前预测的好坏,loss function越小表明预测越好. 几种典型的loss function: 1)Multiclass SVM loss:一般的S ...

  4. 认识Sass和Compass

    第一章 Sass和Compass让样式表重焕青春 // 内容概要// 开始学习Sass和动态样式表// 用Sass更高效地写样式表// Compass简介// 用Compass迎接工程实践中的样式挑战 ...

  5. CTF---密码学入门第一题 这里没有key

    这里没有key分值:10 来源: 西普学院 难度:易 参与人数:5577人 Get Flag:1965人 答题人数:2074人 解题通过率:95% 你说没有就没有啊,俺为啥要听你的啊 解题链接: ht ...

  6. HDU 1847 Good Luck in CET-4 Everybody!(规律,博弈)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. [51nod1440]迈克打电话

    有n只熊,从1到n进行编号. 第i只熊的电话号码是si.每只熊会给那些电话号码是他的子串的熊打电话(可能会给自己打). call(i, j) 表示第i只熊给第j只熊打电话的次数,也就是第j个串在第i个 ...

  8. JS验证两次输入密码是否相同

    js中 <script>function check(){ with(document.all){if(input1.value!=input2.value){alert("fa ...

  9. oracle和mysql分页

    mysql分页 关键字limit,limit m,n 其中m表示起始位置的下标,下标从0开始.n表示要显示的条数,比如要查询一个表的第2到5条数据. ,; oracle分页 关键字rownum, ro ...

  10. 自定义省市选择器 微信小程序多列选择器

    由于微信小程序的选择器为省市区选择器共3列 如我仅需要省市2列的选择器 就需要我们另寻他法找来找去没有合适的 只能自己写了 1. 首先我们把所需要的省数据 市县数据放在一个 p_c.js 文件里面,使 ...