第二章 创建和销毁对象

1.考虑用静态工厂方法代替构造器

  四大优势:

    i. 有名称

    ii. 不必在每次调用它们的时候都创建一个新的对象;

      iii. 可以返回原返回类型的任何子类型的对象;

      JDBC(Java Database Connectivity)

      服务提供者框架(Service Provider Framework)

         服务接口、提供者注册API、服务访问API、服务提供者接口(负责创建其服务实现的实例);

    iv. 在创建参数类型实例的对象,它们使代码变得更加简洁

  下面是一个Boolean(基本类型boolean的包装类)的基本实现:

public static Boolean valueOf(boolean b) {
return b ? Boolean.TURE : Boolean.FALSE;
}

  美中不足处:

    ① 类如果不会含公有的或者受保护的构造器,就不能被子类化

    ② 与其他的静态方法实际上没有区别

  常用的名称:

    valueOf  of  getInstance  newInstance  getType  newType

2.遇到多个构造器参数时,要考虑使用构造器

    class.newInstance 破坏了编译时的异常检查(Builder弥补不足)

    总:如果类的构造器或静态工厂中具有多个参数,考虑用Builder模式;

  下面是示例:

 //Builder Pattern
public class NutritionFacts
{
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate; public static class Builder
{
//Required parameters
private final int servingSize;
private final int servings; //Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0; public Builder(int servingSize, int servings)
{
this.servingSize = servingSize;
this.servings = servings;
} public Builder calories(int val)
{ calories = val; return this; } public Builder fat(int val)
{ fat = val; return this; } public Builder carbohydrate(int val)
{ carbohydrate = val; return this; } public NutritionFacts build() {
return new NutritionFacts(this);
}
} private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
}
}

3.用私有构造器或者枚举类型强化Singleton属性

  单元素的枚举类型已经成为实现Singleton的最佳方法

    实现方式一:公有静态成员是一个final域

//Singleton with public final field
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {......} public void leaveTheBuilding() {......}
}

    实现方式二:  公有的成员是个静态工厂方法

//Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {......}
public static Elvis getInstance() { return INSTANCE;} public void leaveTheBuilding() {......}
}

    实现方式三(最佳实现方式):

        只需编写一个包含单个元素的枚举类型;

      这种方法在功能上与公有域方法相近,当是它更加简洁,无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。

//Enum singleton - the preferred approach
public enum Elvis {
INSTANCE; public void leaveTheBuilding() {......}
}

      

4.通过私有化构造器强化不可实例化的能力

  throw new AssertionError(); (构造器内)

  可在上面加入注释,便于理解,如下:

    suppress default coustructor for noninstratiability.

示例如下:

//Noinstantialbe utility class
public class UtilityClass {
//Suppress default constructor for noninstiability
private UtilityClass() {
throw new AssertionError();
}
...... //Remainder omitted
}

5.避免创建不必要的对象

  update。。。。

《Effect Java》学习笔记1———创建和销毁对象的更多相关文章

  1. Effective Java 学习笔记之创建和销毁对象

    一.考虑用静态工厂方法代替构造器 1.此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法. 2.静态工厂方法的优势有: a.使用不同的方法名称可显著地表明两个静态工厂方法 ...

  2. 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器

    类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...

  3. Effective Java 读书笔记之一 创建和销毁对象

    一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...

  4. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  5. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  6. Effective Java(1)-创建和销毁对象

    Effective Java(1)-创建和销毁对象

  7. effective java 第2章-创建和销毁对象 读书笔记

    背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优 ...

  8. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  9. 《Effective Java》读书笔记 - 2.创建和销毁对象

    Chapter 2 Creating and Destroying Objects item 1:Consider static factory methods instead of construc ...

随机推荐

  1. BZOJ 3929 Circle of digits 解题报告

    首先,我们可以得到最高位的位数为:\(\lfloor\frac{n+k-1}{n}\rfloor\),记作 \(E\). 然后给这 \(n\) 个长为 \(E\) 的数字排序,后缀数组 \(O((n+ ...

  2. [转载]MongoDB开发学习(1)开天辟地,经典入门

    原文地址:http://www.cnblogs.com/xumingxiang/archive/2012/04/08/2437468.html 如果你从来没有接触MongoDB或对MongoDB有一点 ...

  3. PHP7正式版测试,性能惊艳!

    本周迎来2015年编程语言界的两件大事,Swift7 开源, PHP7 发布.这两件大事,都是可以载入相应的编程语言的史册级的事件. Swift 开源的事,咱先不说了,知乎上也有热烈的讨论,我们今天就 ...

  4. GridView使用CommandField删除列实现删除时提示确认框

    在.net2005提供的GridView中我们可以直接添加一个CommandField删除列完后在它的RowDeleting事件中完成删除 GridView在使用CommandField删除时弹出提示 ...

  5. [codility]PrefixMaxProduct

    Codility Certificate题目.求product最大值,product为长度*出现次数,例子"abababa"如下: "a", whose pro ...

  6. Two-Phase Locking

    两阶段封锁(Two-Phase Locking) 两段锁协议的内容 1. 在对任何数据进行读.写操作之前,事务首先要获得对该数据的封锁 2. 在释放一个封锁之后,事务不再获得任何其他封锁. “两段”锁 ...

  7. Yii 实现restful

    首先做一下接口的 URL 规划,假设我们要面对的资源是 item ,现在我们暴露5个接口供其他应用调用,分别是: 对于所有 item 列表调用: GET /rest/item 对于某个 item 信息 ...

  8. 内核驱动中常见的miscdevice、platform_device、platform_driver

    最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解.后来因为想在驱动中实现设备文件的创建,又了解了一下,sysfs文件系统和udev设备文件系统(这两个是两 ...

  9. jni.h头文件详解二

    作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shao ...

  10. Android 内核初识(7)RefBase、LightRefBase、sp和wp

    简介 RefBase是Android中所有对象的始祖,类似MFC中的CObject及Java中的Object对象.在Android中,RefBase结合sp和wp,实现了一套通过引用计数的方法来控制对 ...