首先这里就不说单例模式的饿汉式,懒汉式了,如果需要请百度
比饿汉式,懒汉式好一点的是静态内部类单例
这里贴出代码
package com.test;
public class SimpleTest {
private static class SimpleNB {
private static final SimpleTest INSTANCE = new SimpleTest();
}
private SimpleTest() {
}
public static SimpleTest getIns() {
return SimpleNB.INSTANCE;
}
}
但是这种方式还是会存在我通过反射去得到他的构造方法,然后把构造方法改为公共的,然后newInstance()创建对象
这里贴出代码
package com.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.Predicate;
/**
* @date 2017-10-20
* @author xgf
*
*/
public class Test {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Constructor<SimpleTest> declaredConstructor = SimpleTest.class.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
SimpleTest newInstance1 =declaredConstructor.newInstance();
SimpleTest newInstance2 =declaredConstructor.newInstance();
System.out.println(newInstance1.equals(newInstance2));
}
}
这里得到的结果为false
贴出图片
然后根据这个问题,想出解决办法 用枚举,原因是jvm 因为枚举 ,而构造器 可见性 是不可改变的
这里贴出代码
package com.test;
public enum Singleton6
{
INSTANCE;
private SimpleTest instance;
Singleton6()
{
instance = SimpleTest.getIns();
}
public SimpleTest getInstance()
{
return instance;
}
}然后是测试代码
package com.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.Predicate;
/**
* @date 2017-10-20
* @author xgf
*
*/
public class Test {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Constructor<Singleton6> declaredConstructor = Singleton6.class.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
Singleton6 newInstance1 =declaredConstructor.newInstance();
Singleton6 newInstance2 =declaredConstructor.newInstance();
System.out.println(newInstance1.equals(newInstance2));
// Singleton6 instance1 = Singleton6.INSTANCE;
// Singleton6 instance2 = Singleton6.INSTANCE;
// System.out.println(instance1.equals(instance2));
// Constructor<SimpleTest> declaredConstructor = SimpleTest.class.getDeclaredConstructor();
// declaredConstructor.setAccessible(true);
// SimpleTest newInstance1 =declaredConstructor.newInstance();
// SimpleTest newInstance2 =declaredConstructor.newInstance();
// System.out.println(newInstance1.equals(newInstance2));
}
}
然后贴出控制台输出结果
到这里,基本应该懂了吧,能看到这里的人,我只希望大家能也多分享一些(不论是技术还是任何其他事),感恩前人。有什么问题,请评论或者给我发私信,谢谢大家
770

被折叠的 条评论
为什么被折叠?



