Effective Java 学习笔记(3)
在实现singleton模式时,我们有以下几种方法。
1. public static final 字段加上private 的构造函数。
public class Singleton{
public static final Singleton INSTANCE = new Singleton();
private Singleton() { ... }
}
这种方法简单,其中的字段让人一目了然就知道这个类是Singleton模式,用final关键字确保这个变量在初始化后就不会再被更改,但要注意的是小心防止少数别有用心的程序使用AccessibleObject.setAccessible来访问私有构造函数,这时可以在私有构造函数中判断当创建第二个实例的时候抛出一个异常。
2. private static final 字段加上private 的构造函数再加上public 静态工厂函数
public class Singleton{
private static final Singleton INSTANCE = new Singleton();
private Singleton() { ... }
public static Singleton getInstance{}{return INSTANCE;}
}
这种方式不用担心性能问题,因为现在的JVM会把绝大多数的静态工厂函数改为内联。此外,这种方法还可以在不改变API的情况下对返回值进行改变,即在以后根据需要是否返回第二个实例,或是每个线程一个实例。
对于以上两种方法在串行化的时候要注意,不能仅仅只加上implements Serializable接口,这样会导致每次反序列化的时候创建一个新对象,这样就不是真正的singleton了,解决这个问题的方法是在声明的时候对每一个final字段加上transient关键字,然后再实现一个readResolve方法。
private Object readResolve() {
return INSTANCE;
}
对于java 1.5后的版本,实现singleton模式最好的方法是用枚举。
public enum Singleton {
INSTANCE;
}
这种方法没有上面说的缺点,是最优的方法。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mutsinghua/archive/2010/01/16/5199124.aspx
相关文档:
Java.sql包中的 java.sql.Driver, jdbc.sql.Connection等提供给程序开发人员统一的开发接口,数据库提供商提供相应的实现,对程序开发人员来讲只要知道这些接口都有哪些方法就可以了。但我们可以深入一些看看到底这里面都做了那些事, 同时也可以学习其中的编程模式(如Interface模式等)。
1、 Class.forName(String cl ......
本文提供java多线程分别定时读写同一个文件的样例,其中两个线程,一个每分钟写入当前时间到指定文件,另一个线程读出每分钟新写的内容。
使用简单的Thread.sleep技术实现定时
package test.thread;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
im ......
通常,有一类问题的产生都是由于没有重载hashCode这个方法. 当你重载equals后,hashCode必须重载,否则在使用HashMap, HashSet, Hashtable的时候,会出错.
对于hashCode有几个原则.
1. 不管什么时候调用hashCode,如果同一个对象与hashCode相关的字段没有修改的话,这个方法的返回值必须相同. 但不必和另一个应用程序中的值相等 ......
有时,我们在写一个构造函数时,经常因为它包含众多的参数而苦恼,这时可以考虑用Builder模式来创建对象。
如,我们要设计一个营养成份的类,包含能量,蛋白质,脂肪,钙,铁,锌,维生素A, 维生素B1 ... 等,但在构造的时候,不一定每次都需要这些参数,如钙,铁,锌和维生素等是可选的,为了适应多种可能的搭配,比较原始 ......