利用静态变量实现单例模式
public class Singleton {
int test_singleton;
private Singleton() {}
public static Singleton instance = new Singleton();
public static Singleton get_instance(){
return instance;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton A = Singleton.get_instance();
A.test_singleton = 2;
Singleton B = Singleton.get_instance();
B.test_singleton = 1;
System.out.println(A.test_singleton);
System.out.println(B.test_singleton);
}
}
运行结果:
1
1
但是这种实现方法会被java反射机制攻击
import java.lang.reflect.Constructor;
public class Singleton {
int test_singleton;
private Singleton() {}
public static final Singleton instance = new Singleton();
public static Singleton get_instance(){
return instance;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton A = Singleton.get_instance();
A.test_singleton = 2;
Singleton B = Singleton.get_instance();
B.test_singleton = 1;
try{
Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton singletonnew = constructor.newInstance();
singletonnew.test_singleton = 15;
System.out.println(A.test_singleton);
System.out.println(B.test_singleton);
System.out.println(singletonnew.test_singleton);
System.out.println(A == singletonnew);
}catch(Exception e){
e.printStackTrace();
}
}
}
输出结果
1
1
15
false
其中setAccessible(true)可以禁止java对控制权限的检查
关于反射机制的原理、功能,可参考
还有一般使用
public static final Singleton instance = new Singleton();
感觉final可有可无
后续会更新此文