一个Java类中只能包括:成员变量、方法、构造器、初始化块、内部类(包括接口、枚举)
单例类
单例类:某些时候要为某一个类仅允许创建一个实例(注释1)
要实现单例类
- 构造器不能暴露,用private修饰,否则就可以创建多个实例
- 要暴露一个方法,用public修饰,让这个方法去创建实例。由于程序必须通过该方法来获取实例,所以在调用该方法之前,肯定没有实例(这个时候要用过一个判断实例是否为null),因此只能通过类来调用 —— 该方法必须用static修饰(注释2)
- 使用静态field来缓存“已有的实例”,每次在获取实力之前,先判断是否能已有“缓存”实例,如果没有缓存过,就创建 ;否则直接返回“缓存”的实例
class Singleton{
//使用一个类变量来缓存曾经创建的实例
private static Singleton instance;
//隐藏构造器
private Singleton() {
}
//创建一个静态方法,以便可以让类来调用,用于返回Singleton实例
//该方法可以追加自定义控制,保证只产生一个Singleton对象
public static Singleton getInstance() {
//如果instance为null,表明不存在instance对象
//若果instance不为null,表明已经存在了instance对象,就创建一个instance对象
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class SingletonTest {
public static void main(String[] args) {
//对于静态变量,要用静态类来调用方法来实现
//因为没有构造器,所以也不能new
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
//已知用==来判断类型时,会判断是否为用一个对象
System.out.println(s1==s2); //会输出true,所以为同一个对象
}
}
【注释1】频繁穿件对象、回收对象会带来系统的开销问题,导致系统性能下降
【注释2】因为在调用方法之前还不存在对象,所用用该方法的不可能是对象,只能是类。又因为静态变量不能访问非静态变量,所以,方法必须由static修饰