Effective Java 1:创建和销毁对象-续

第二条:遇到多个构造器参数时,要考虑用构建器

  静态工厂方法和构造器都不能很好的扩展到大量的可选参数,如果用构造函数,需要采用重叠构造器模式,缺点,当有很多参数时,客户端代码,很难调试,难以阅读,

  第二种代替方法是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的最佳方法  

原文地址:https://www.cnblogs.com/csxf/p/3280026.html