创建和销毁对象

一.静态工厂方法代替构造器

 静态工厂方法的优缺点

  优点:

    1.可以自定义名称(可以将功能表述的更加清晰)

    2.不必每次调用都创建新的对象(同一对象重复使用)

    3.返回的类型可以是原返回类型的任何子类型对象

    4.简化创建对象时的代码

  缺点:

    1.如果不含有公开的构造器,就不能被子类化

    2.和普通的静态方法没有区别

二.遇到多个构造器参数时考虑用构建器

  如果我们现在需要编写一个描述客户信息的类,在客户的信息中名字是一定有的,其他的信息都是可能用,我们使用三种方法去完成:

1.重叠构造器方法(代码已经简化)

 /**
* 客户信息
*/
public class Customer {
private String name;//姓名
private String profession;//职业
private int age;//年龄
private String gender;//性别 public Customer(String name){
this.name=name;
} public Customer(String name,String profession){
this.name=name;
this.profession=profession;
} public Customer(String name,String profession,int age){
this.name=name;
this.profession=profession;
this.age=age;
} public Customer(String name,String profession,int age,String gender){
this.name=name;
this.profession=profession;
this.age=age;
this.gender=gender;
}
}

  创建实例:

Customer customer=new Customer("李雷", "程序员", 27, "男");

  总结:这里是简化后的代码,此实例才4个参数就如此繁琐,随着参数的增加,将会失去控制。

2.JavaBean模式(调用无参构造方法,然后用set方法赋值)

 /**
* 客户信息
*/
public class customer {
private String name;//姓名
private String profession;//职业
private int age;//年龄
private String gender;//性别 public customer(){} public void setName(String name) {
this.name = name;
} public void setProfession(String profession) {
this.profession = profession;
} public void setAge(int age) {
this.age = age;
} public void setGender(String gender) {
this.gender = gender;
}
}

  创建实例:

        customer customer=new customer();
customer.setAge(27);
customer.setGender("男");
customer.setName("李雷");
customer.setProfession("程序员");

  总结:创建实例容易,也比较容易阅读,但是由于对象的构造过程被分到了几部调用中,JavaBean可能处于不一致的状态,而且使用此模式无法将类制作成不可变的。

3.构建器(Builder模式)

 /**
* 客户信息
*/
public class Customer {
private final String name;//姓名
private final String profession;//职业
private final int age;//年龄
private final String gender;//性别 public static class Builder{
private final String name; private String profession="无";
private int age=0;
private String gender="未知"; public Builder(String name){
this.name=name;
} public Builder profession(String val){
profession=val;
return this;
} public Builder age(int val){
age=val;
return this;
} public Builder gender(String val){
gender=val;
return this;
} public Customer build(){
return new Customer(this);
}
} private Customer(Builder builder){
name=builder.name;
profession=builder.profession;
age=builder.age;
gender=builder.gender;
}
}

  创建实例:

    创建对象时,类名后面加括号表示调用无参的构造函数;不加括号表示调用默认的构造函数或唯一的构造函数     
  Customer customer=new Customer.Builder("李雷").age(27).gender("男").profession("程序员").build();

  总结:编写容易,易于阅读,而且模拟了具名的可选参数,安全性高,后期的扩展性强。

3.单元素枚举是实现Singleton的最佳方法

 public enum Elvis {
INSTANCE; public void leaveTheBuilding(){
System.out.println("Singleton!");
}
}

  创建实例:

        Elvis elvis=Elvis.INSTANCE;

4.消除对其对象的引用

  下面是一个栈的简单实现:

public class Stack {
private Object[] elements;
private int size=;
private static final int DEFAULE_INITAL_CAPACITY=; public Stack(){
elements=new Object[DEFAULE_INITAL_CAPACITY];
} public void push(Object e){
ensureCapacity();
elements[size++]=e;
} public Object pop(){
if (size==) {
throw new EmptyStackException();
}
return elements[--size];
} public void ensureCapacity(){
if (elements.length==size) {
elements=Arrays.copyOf(elements, *size+);
}
}
}

  如果一个栈显示增长,然后再收缩,那么从栈中弹出的对象将不会被当做垃圾回收,我们应该将过期的引用清空,将pop方法改动如下:

    public Object pop(){
if (size==) {
throw new EmptyStackException();
}
elements[size]=null;
return elements[--size];
}

  

Effective Java学习笔记--创建和销毁对象的更多相关文章

  1. Effective Java读书笔记--创建和销毁对象

    1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...

  2. [Effective Java]第二章 创建和销毁对象

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. Effective Java2读书笔记-创建和销毁对象(三)

    第5条:避免创建不必要的对象 本条主要讲的是一些反面教材,希望大家引以为鉴. ①无意中使用自动装箱导致多创建对象. public class Sum { public static void main ...

  4. Effective Java2读书笔记-创建和销毁对象(一)

    第1条:考虑用静态工厂方法代替构造器 通常情况下,我们创建一个对象采取new的形式,但是还有一种方法也是经常使用到的,它的名称叫做静态工厂方法. 例如,java中基本类型boolean的包装类Bool ...

  5. Effective Java2读书笔记-创建和销毁对象(四)

    第7条:避免使用终结方法 这一条讲的简直是不知所云.先简单记下来其中说出的几条: ①显式终止方法的典型例子有InputStream.OutputStream和java.sql.Connection上的 ...

  6. Effective Java2读书笔记-创建和销毁对象(二)

    第3条:用私有构造器或者枚举类型强化Singleton属性 这一条,总体来说,就是讲了一个小技巧,将构造器声明为private,可以实现单例.具体有以下几种实现的方式. ①最传统的单例实现模式,可能有 ...

  7. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  8. Effective Java学习笔记

    创建和销毁对象 第一条:考虑用静态工厂方法替代构造器 For example: public static Boolean valueOf(boolean b){ return b ? Boolean ...

  9. Java 学习笔记 ------第五章 对象封装

    本章学习目标: 了解封装的概念与实现 定义类.构造函数与方法 使用方法重载与不定长度自变量 了解static方法 一.Java封装概念 在面向对象程式设计方法中,封装(英语:Encapsulation ...

随机推荐

  1. TensorFlow进阶(一)----张量的阶和数据类型

    张量的阶和数据类型 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通.其实张量更 ...

  2. Chrome/FireFox处理JSON的插件

    Chrome/FireFox处理JSON的插件 JSON插件   效果对比 对于json的数据如果不编排一下格式查看起来很费劲,今天推荐一款chrome/Firfox下处理json的插件JSON-ha ...

  3. 在做了 BasePage 时: 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 / / 节中包括

    摘自: http://lichengguizy.blog.163.com/blog/static/11771858620122342749552/ 只有在配置文件或 Page 指令中将 enableS ...

  4. mysql索引处理

    1.索引作用在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍.例如,有3个 ...

  5. 【云计算】Ubuntu14.04 搭建GlusterFS集群

    1.修改 /etc/hosts 所有服务节点执行(如果集群中没有DNS,可忽略此步骤): 10.5.25.37 glusterfs-1-5-25-3710.5.25.38 glusterfs-2-5- ...

  6. 组件prop检验

    Vue.js中的父子组件相信都已经是大家很常用到的功能了, 父组件通过props属性向子组件传值子组件通过自定义事件向父组件传值 那么我们怎么去校验props属性中的类型呢 笔者列出以下几种方法: 1 ...

  7. intellij idea使用maven本地仓库及修改本地仓库路径

    什么maven本地仓库,默认是用户目录下的.m2/repository这个文件. idea是自带maven插件的不用我们再,怎么把依赖包下载到我们的本地仓库呢?一般是idea默认了路径,而且idea是 ...

  8. iOS开发之使用UICollectionView实现美团App的分类功能【偶现大众点评App的一个小bug】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  9. 深入分析JavaWeb Item24 -- jsp2.X自己定义标签开发进阶

    一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完毕不同的功能,显得过于繁琐.不利于标签技术的推广, SUN公司为减少标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...

  10. 《深入浅出pig系列之中的一个》pig-0.12.0-cdh5.1.2的安装与执行

    这里使用的版本号是cdh发行的pig-0.12.0-cdh5.1.2 下载地址点这里 1.Pig简单介绍: Pig是yahoo捐献给apache的一个项目.它是SQL-like语言.是在MapRedu ...