Effective Java 之-----静态工厂与构造器
一、 考虑用静态工厂方法代替构造器:
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 之-----静态工厂与构造器的更多相关文章
- Effective Java —— 用静态工厂方法代替构造器
本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...
- Effective Java第三版(一) ——用静态工厂代替构造器
此文做为<Effective Java>系列的第一篇,所以有必要大概说下此书的特点,当然很多人可能都看过,毕竟是有着Java四大名著之一的大名在外,不过总会有萌新不了解,例如我!<E ...
- 读Effective Java笔记之one:static Factory methods instead of Constructors (静态工厂方与构造器)
获取类的实例的方法有很多种,在这很多种方法中,它们各有优缺,各有特点.这里,只介绍2中方法 1.使用构造方法 public class Person { private String sex; /** ...
- Java - 用静态工厂方法代替构造器
Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...
- Java 的静态工厂方法
本文转载自:https://www.jianshu.com/p/ceb5ec8f1174 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器不同的第一优势在于,它们有名 ...
- 解析《Effective Java》之多个构造器、Javabeans模式和Builder模式
最近看<Effective Java>这本被很多同行称为神作的书,但是这本书很多地方缺少了举例不好懂,下面是关于我对书上知识的理解. 一.<Effective Java>中文版 ...
- Java设计模式———静态工厂
上课时yqj2065要求:除了JDK等框架或工具中的类,自己编写的类不得使用new创建对象(Test除外). 据说是因为使用new会涉及到硬编码.(不是很懂) 所以要求用God类利用反射+配置文件来创 ...
- 【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性
实现Singleton(代表本质上唯一的系统组件)的三种方法: 1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例. 2. 保持私有构造器,公有的成员是静态工厂方法. 3. 单元素的枚 ...
- 【读书笔记 - Effective Java】04. 通过私有构造器强化不可实例化的能力
工具类(utility class)不希望被实例化,比如只包含静态方法和静态域的类.为了这个目的,需要让这个类包含一个私有构造器. // 私有构造器示例 public class UtilityCla ...
随机推荐
- CSS3让长单词与URL地址自动换行——word-wrap属性
div{ word-wrap:break-word; } word-wrap属性可以使用的属性值为normal与break-word两个.使用normal属性值时浏览器默认处理,只在半角空格或者连字符 ...
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】
A - K-City Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement In K-city, ...
- BC#65T4 ZYB's Tree
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5593 点分治被卡了TAT... 正解是dp,可以按层数考虑dp,先预处理跑一边dfs得到子树各层数点数大小 ...
- 2017ICPC/广西邀请赛1001(水)HDU6181
A Math Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Convex(扫描线降维)
Convex Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- angular $stateProvider 路由的使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- bat脚本设置系统环境变量即时生效
关于bat的资料多但零碎,记录一下. 1.设置环境变量即时生效:通过重启explorer来实现即时生效(亲测有效) @echo off set curPath=%cd% wmic ENVIRONMEN ...
- HTML 5 <canvas> 标签
<!DOCTYPE HTML> <html> <body> <canvas id="myCanvas">your browser d ...
- dede织梦栏目页和文章页中获取当前栏目名称方法
一般情况下,在dede织梦系统中列表页.栏目页和文章页中获取当前所在栏目名称只需要代码:{dede:type}[field:typename]{/dede:type}即可,不需要定义ID,默认的就是当 ...