#新手入门
#Java面向对象
刚开始学习Java面向对象,想询问一下通讯录系统中的查询该如何去写(就是想通过输入学号来查询到具体的人)。
万分感谢
有数据库和表了吗?
不知道你这个问题是否已经解决, 如果还没有解决的话:enum Singleton5 {//枚举类的单例模式
INSTANCE;
public Singleton5 getInstance(){
return INSTANCE;
}
}
1、 私有化构造器并不保险,通过反射机制调用私有构造器。而枚举类不能被反射,所以可以防止反射攻击
//模拟反射攻击
class Singleton {//双重校验锁,性能佳线程安全
private static Singleton4 instance=null;
private Singleton4() {}
public static Singleton4 getInstance() {
if(instance==null) {
synchronized (Singleton4.class) {
if (instance==null) {
//new对象分为三个操作
//分配内存
//调用构造方法初始化
//赋值
instance=new Singleton4();
}
}
}
return instance;
}
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Singleton s=Singleton.getInstance();
Singleton sUsual=Singleton.getInstance();
Constructor<Singleton> constructor=Singleton.class.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton sReflection=constructor.newInstance();
System.out.println(s+"\n"+sUsual+"\n"+sReflection);
System.out.println("正常情况下,实例化两个实例是否相同:"+(s==sUsual));
System.out.println("通过反射攻击单例模式情况下,实例化两个实例是否相同:"+(s==sReflection));
}
//com.lxp.pattern.singleton.Singleton@1540e19d
//com.lxp.pattern.singleton.Singleton@1540e19d
//.lxp.pattern.singleton.Singleton@677327b6
//正常情况下,实例化两个实例是否相同:true
//通过反射攻击单例模式情况下,实例化两个实例是否相同:false
2.避免序列化问题(任何一个readObject方法,不管是显式的还是默认的,它都会返回一个新建的实例,这个新建的实例不同于该类初始化时创建的实例)