Effective Java总结
规则1. 用静态工厂方法代替构造器
例子:
public class Example {
}
public class StaticFactory {
//valueOf/Of/getInstance/newIntance
private static volatile Example example = null;
public static Example newIntance(){
return new Example();
} public static Example getInstance(){
if (example == null) {
synchronized (Example.class) {
if (example == null) {
return new Example();
}
}
}
return example;
} public static void main(String[] args) {
Example example = StaticFactory.getInstance();
System.out.println(example.hashCode());
Example example1 = StaticFactory.newIntance();
Example example2 = StaticFactory.newIntance();
System.out.println(example1 == example2);
}
}
好处:(通过规则1,终于知道经常出现的getInstance()和newInstance()的区别)
1. 方法名有意义;
2. 可以创建新实例,也可以单例(控制对象的生产方式)
3. 可将多态应用在实例创建上
缺点:
1. 实例的构造方法为public/protected
2. 和普通静态方法一样
规则2. 用Builder实现多个参数的构造器
例子:
public class NutritionFacts { //required
private final int servingSize;
private final int servings;
//optional
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate; private NutritionFacts(Builder builder){
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
} public static class Builder{
//required
private int servingSize;
private int servings;
//optional(default)
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0; public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
} public Builder calories(int calories){
this.calories = calories;
return this;
}
public Builder fat(int fat){
this.fat = fat;
return this;
}
public Builder sodium(int sodium){
this.sodium = sodium;
return this;
}
public Builder carbohydrate(int carbohydrate){
this.carbohydrate = carbohydrate;
return this;
} //build()
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
}
public static void main(String[] args) {
NutritionFacts nutritionFacts = new NutritionFacts.Builder(2,3)
.calories(12).carbohydrate(23).fat(1).sodium(8).build(); }
终于知道有些源码里出现静态内部类Builder的原理了。。
好处:
1. 避免构造函数有多个参数或者重载多个构造函数的情况
2. 如果想用JavaBean的形式解决,需要调用很多setter方法,容易出现线程不安全的问题
比如:
public class NutritionFactsSetter { private int servingSize;
private int servings;
private int calories;
private int fat; public int getServingSize() {
return servingSize;
}
public int getServings() {
return servings;
}
public int getCalories() {
return calories;
}
public int getFat() {
return fat;
}
public void setServingSize(int servingSize) {
this.servingSize = servingSize;
}
public void setServings(int servings) {
this.servings = servings;
} public void setCalories(int calories) {
this.calories = calories;
}
public void setFat(int fat) {
this.fat = fat;
}
public static void main(String[] args) {
NutritionFactsSetter factsSetter = new NutritionFactsSetter();
factsSetter.setCalories(0);
factsSetter.setServings(0);
factsSetter.setFat(20);
}
}
但是,通过Builder方式构建出的对象是不可改变的(在NutritionFacts类中,所有属性和方法以及构造函数都是private的),所以不存在线程不安全问题。
3. 一个Builder对象可以重复用来实例化对象。
4. 避免Class.newInstance()方法的异常处理情况
缺点:
1. 实例化语句显得有些冗长
规则3.
Effective Java总结的更多相关文章
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- 《Effective java》-----读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...
- 《Effective Java》学习笔记——积累和激励
从一个实际案例说起 国庆长假前一个礼拜,老大给我分配了这么一个bug,就是打印出来的报表数量为整数的,有的带小数位,有的不带,毫无规律. 根据短短的两个多月的工作经验以及猜测,最终把范围缩小到以下这段 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- effective java 读后感
think in java , effective java 这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- effective java —— 终结方法守卫者
目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...
- Effective Java 创建和销毁对象
<Effective Java>阅读笔记,用适合自己理解的方式提炼该书内容.<Effective Java>是一本很实用的书,阅读方法应该是快速的领会,总结,然后应用.而非,一 ...
- Effective Java
Effective Java 创建和销毁对象---考虑用静态工厂方法代替构造器 构造器是创建一个对象实例最基本也最通用的方法,大部分开发者在使用某个class的时候,首先需要考虑的就是如何构造和初始化 ...
- Effective Java Index
Hi guys, I am happy to tell you that I am moving to the open source world. And Java is the 1st langu ...
随机推荐
- Windows下安装Elasticsearch
1.下载elasticsearch-1.6.0 .jdk-7u67-windows-x64.exe 1.6.0必须用jdk1.7才能运行 2.配置JAVA_HOME:C:\Program Files\ ...
- 添加Microsoft SQL JDBC driver 到 Maven
主要步骤如下: 1. 本地下载sqljdbc4.jar 2. 解压到本地文件夹中,并找到sqljdbc4.jar路径 3. 打开命令窗口,打开至工程目录,执行以下语句(前提:先配置好maven环境变量 ...
- 怎样使android的view动画循环弹动
在res中建立文件夹anim,分别写下cycles.xml,shake1.xml,shake2.xml cycles.xml: <?xml version="1.0" enc ...
- Spark官方文档——独立集群模式(Standalone Mode)
除了部署在Mesos之上, Spark也支持独立部署模式,包括一个Spark master进程和多个 Spark worker进程.独立部署模式可以运行在单机上作为测试之用,也可以部署在集群上.如果你 ...
- ContactsContract.CommonDataKinds【Translated By KillerLegend】
http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.html interf ...
- DIV JS CSS 轻量级弹出层 兼容各浏览器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 010-python基础-数据类型-字符串操作
1.移除空白 username.strip() 2.分割 names = "alex,jack,rain" names_1 = names.split(",") ...
- .Net码农学Android---快速了解数据存储
数据存储 Andoid中的数据存储和我们平时见到的不一样,或者说移动设备的存储和平时不一样.Andoid中的存储方式有五种, 单把存储拎出来,是因为我们后续的开发会经常用到,重要性不言而喻,多样的存储 ...
- Debug.print的用法
使用Debug.print可以用来更好的调试VBA程序 通过ALT+F11代开VBA编程窗口) 插入模块,接着在窗口中输入以下代码,按F5执行 Sub Excute() Debug.Print * + ...
- 微信支付开发h5发起支付再次签名,返回给h5前端
注意:参数区分大小写.