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 ...
随机推荐
- 原生ajax jq跨域
原生js封装ajax //创建XmlhttpRequest对象 function createXHR(){ var xhr=null; if(XMLHttpRequest){ ...
- nohup—后端守护进程
要将一个命令放到后台执行,我们一般使用nohup sh command & 为什么要nohup? 因为我用使用Scrt这种终端工具退出的时候会向我们在当前shell下启动的进程发生一个SIGH ...
- JavaScript call()和apply()
ECMAScript规范给所有函数都定义了call()与apply()两个方法,call()与apply()的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递 ...
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861A k-rounding【暴力】
A. k-rounding time limit per test:1 second memory limit per test:256 megabytes input:standard input ...
- Gym 100952B&&2015 HIAST Collegiate Programming Contest B. New Job【模拟】
B. New Job time limit per test:1 second memory limit per test:64 megabytes input:standard input outp ...
- android手机安全卫士、Kotlin漫画、支付宝动画、沉浸状态栏等源码
Android精选源码 轻量级底部导航栏 android手机卫士源码 android实现高仿今日头条源码 一个用Kotlin写的简单漫画App源码 android吐槽项目完整源码 ...
- angularJS 与angujs-sku实现购物车组合查询
原网址:http://sentsin.com/web/1069.html demo : https://codepen.io/hzxs1990225/pen/VYyOdW 修复版文件下载:htt ...
- Django App(二) Connect Mysql & defualt App admin
这一篇接着上一篇polls App自动创建admin app. 1.安装数据库 这里的内容从官网看越看越像 EntityFramework的内容.Python支持SQLite,MySql,Or ...
- 注意SSIS中的DT_NUMERIC类型转换为字符类型(比如DT_WSTR)时,会截断小数点前的0
我们知道SSIS中有许多数据类型,如下图所示: 但是DT_NUMERIC这个类型有个陷进要注意,我们来做个实验,随便定义一个String类型的SSIS包变量,然后打开该变量表达式窗口: 在变量表达式窗 ...
- php中urldecode()和urlencode()起什么作用啊
urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%. urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其 ...