Effective Java 1:创建和销毁对象-续
2013-08-24 21:30
211 查看
第二条:遇到多个构造器参数时,要考虑用构建器
静态工厂方法和构造器都不能很好的扩展到大量的可选参数,如果用构造函数,需要采用重叠构造器模式,缺点,当有很多参数时,客户端代码,很难调试,难以阅读,
第二种代替方法是JavaBean模式,缺点:构造过程被分到几个调用中,在构造过程中JavaBean,可能处于不一致的状态,而且阻止了把类变成不可变得可能,
第三种方法:Builder模式,能够保证像重叠构造器模式那样安全性,builder模式模拟了具名的可选参数,就像Ada和Python中的一样,
总结:如果类的构造器或者静态工厂方法中具有多个参数,设计这种类时,BUilder模式是个很好的选择,特别是大多数参数是可选的
第三条:用私有构造器或者枚举类型强化Singleton属性
三种方法:(1). public static final ClassName instanceName=new ClassName(); (2). 前面是private类型,public static getInstance(){return instanceName;}
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据
为了利用其中一种方法实现singleton 类变成可序列化(Serializable),声明中加上implements Serializable ,必须声明所有实例域都是舜时(tranient),并提供一个readResolve()方法,
控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据
我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable
Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容
(3)只需要编写一个包含单个元素的枚举类型,
Java的枚举类型实质上是功能齐全的类,因此可以有自己的属性和方法。
Java枚举类型的基本思想是通过公有的静态final域为每个枚举常量导出实例的类。
从某个角度讲,枚举是单例的泛型化,本质上是单元素的枚举。
用枚举来实现单例非常简单,只需要编写一个包含单个元素的枚举类型即可。示例代码如下:
public enum Evils{
INSTANCE;
}
优点:更加简洁,无偿提供了序列化机制,绝对放在多次实例化,单元素枚举类型已经成为实现Singleton的最佳方法
静态工厂方法和构造器都不能很好的扩展到大量的可选参数,如果用构造函数,需要采用重叠构造器模式,缺点,当有很多参数时,客户端代码,很难调试,难以阅读,
第二种代替方法是JavaBean模式,缺点:构造过程被分到几个调用中,在构造过程中JavaBean,可能处于不一致的状态,而且阻止了把类变成不可变得可能,
第三种方法:Builder模式,能够保证像重叠构造器模式那样安全性,builder模式模拟了具名的可选参数,就像Ada和Python中的一样,
总结:如果类的构造器或者静态工厂方法中具有多个参数,设计这种类时,BUilder模式是个很好的选择,特别是大多数参数是可选的
第三条:用私有构造器或者枚举类型强化Singleton属性
三种方法:(1). public static final ClassName instanceName=new ClassName(); (2). 前面是private类型,public static getInstance(){return instanceName;}
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据
为了利用其中一种方法实现singleton 类变成可序列化(Serializable),声明中加上implements Serializable ,必须声明所有实例域都是舜时(tranient),并提供一个readResolve()方法,
控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据
我们现在再来介绍一个接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable
Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容
(3)只需要编写一个包含单个元素的枚举类型,
Java的枚举类型实质上是功能齐全的类,因此可以有自己的属性和方法。
Java枚举类型的基本思想是通过公有的静态final域为每个枚举常量导出实例的类。
从某个角度讲,枚举是单例的泛型化,本质上是单元素的枚举。
用枚举来实现单例非常简单,只需要编写一个包含单个元素的枚举类型即可。示例代码如下:
public enum Evils{
INSTANCE;
}
优点:更加简洁,无偿提供了序列化机制,绝对放在多次实例化,单元素枚举类型已经成为实现Singleton的最佳方法
相关文章推荐
- 01 Effective Java 系列-创建和销毁对象
- [Effective Java]创建和销毁对象
- Effective Java 创建和销毁对象 1.考虑用静态工厂方法代替构造器
- [Effective Java]第二章 创建和销毁对象
- 【Effective Java学习】创建和销毁对象--考虑用静态方法代替构造器
- Effective Java 02 创建和销毁对象笔记
- Effective Java 创建和销毁对象(1~7)
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第三 四条
- effective java(创建和销毁对象)
- Effective Java 创建和销毁对象 3.用私用构造器或者枚举类型强化Singleton属性
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第二条
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第五条
- 《Effective java 第2版》读书笔记--创建/销毁对象
- effective java 创建和销毁对象
- 【Effective Java】Ch2_创建销毁对象:Item3_通过私有构造函数或枚举类型来强化Singleton属性
- Effective Java - 创建和销毁对象 - 避免创建不必要的对象
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第一条
- Effective Java-1 创建和销毁对象
- 《Effective java》学习笔记 1 之 对象创建和销毁
- 《Effective Java》阅读笔记之对象创建及销毁