Effective Java学习笔记--创建和销毁对象
创建和销毁对象
一.静态工厂方法代替构造器
静态工厂方法的优缺点
优点:
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学习笔记--创建和销毁对象的更多相关文章
- Effective Java读书笔记--创建和销毁对象
1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...
- [Effective Java]第二章 创建和销毁对象
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Effective Java2读书笔记-创建和销毁对象(三)
第5条:避免创建不必要的对象 本条主要讲的是一些反面教材,希望大家引以为鉴. ①无意中使用自动装箱导致多创建对象. public class Sum { public static void main ...
- Effective Java2读书笔记-创建和销毁对象(一)
第1条:考虑用静态工厂方法代替构造器 通常情况下,我们创建一个对象采取new的形式,但是还有一种方法也是经常使用到的,它的名称叫做静态工厂方法. 例如,java中基本类型boolean的包装类Bool ...
- Effective Java2读书笔记-创建和销毁对象(四)
第7条:避免使用终结方法 这一条讲的简直是不知所云.先简单记下来其中说出的几条: ①显式终止方法的典型例子有InputStream.OutputStream和java.sql.Connection上的 ...
- Effective Java2读书笔记-创建和销毁对象(二)
第3条:用私有构造器或者枚举类型强化Singleton属性 这一条,总体来说,就是讲了一个小技巧,将构造器声明为private,可以实现单例.具体有以下几种实现的方式. ①最传统的单例实现模式,可能有 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- Effective Java学习笔记
创建和销毁对象 第一条:考虑用静态工厂方法替代构造器 For example: public static Boolean valueOf(boolean b){ return b ? Boolean ...
- Java 学习笔记 ------第五章 对象封装
本章学习目标: 了解封装的概念与实现 定义类.构造函数与方法 使用方法重载与不定长度自变量 了解static方法 一.Java封装概念 在面向对象程式设计方法中,封装(英语:Encapsulation ...
随机推荐
- 流畅的python第十九章元编程学习记录
在 Python 中,数据的属性和处理数据的方法统称属性(attribute).其实,方法只是可调用的属性.除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法 ...
- Json.net说法——(一)修饰标签,日期序列化
摘自: http://www.cnblogs.com/jams742003/archive/2009/12/24/1631587.html 通过属性标签自定义JSON序列化 JsonObjectAtt ...
- C#高级编程八十二天----用户自己定义异常类
用户自己定义异常类 前面已经说了不少关于异常的问题了,如今来给大家说一下自己定义异常时咋个回事以及咋样. 为啥会出现自己定义异常类呢? 用用脚趾头想想也明确,是为了定义咱们自己的异常,自己定义异常 ...
- thinkphp5.0 中使用第三方无命名空间的类库
ThinkPHP5建议所有的扩展类库都使用命名空间定义,如果你的类库没有使用命名空间,则不支持自动加载,必须使用Loader::import方法先导入文件后才能使用. 首先要在文件头部使用loader ...
- Window下使用Xshell连接VirtualBox中CentOS SSH最佳实践
网上已经有非常多讲怎样连接VMware的文章.可是针对一些可能遇到的细节没有讲全. 这里会有一个非常 实际的样例,附带全部软件的链接,保证成功. 最佳实践什么的都是骗人的. 1.安装VirtualBo ...
- Centos 7 通过yum的方式安装配置Artifactory 5.10
制品仓库系统有很多,例如:Artifactory,Nexus,Archiva, 其中Artifactory拥有很多强大的企业级特性和人性化的用户接口,很多大型的公司都在使用它. 背景:因客户需求,需要 ...
- Linux命令计算文件中某一列的平均值
例如每秒执行一次top命令,把结果输出到某个文件中保存,现在需要统计这段时间内某个进程的平均CPU占用率,可使用以下命令 | grep "GameServer_r" | awk ' ...
- python 带颜色样式打印到终端
#!/usr/bin/python # -*- coding: utf-8 -*- """ Created on Tue Aug 8 17:01:54 2017 @aut ...
- 算法笔记_050:硬币收集问题(Java)
目录 1 问题描述 2 解决方案 2.1 动态规划法 1 问题描述 在n*m格木板中放有一些硬币,每格的硬币数目最多为一个,在木板左上方的一个机器人需要收集尽可能多的硬币并把它们带到右下方的单元格 ...
- 网络编程-Java中的Internet查询
前提 在深入理解URL.URI等概念,或者学些Socket相关的知识之,有必要系统理解一下Internet相关的一些基础知识. Internet地址 连接到Internet(因特网)的设备称为节点(n ...