单例模式 静态内部类 解决反射得到多个对象

首先这里就不说单例模式的饿汉式,懒汉式了,如果需要请百度


饿汉式,懒汉式好一点的是静态内部类单例

这里贴出代码

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));
	}
}

然后贴出控制台输出结果


到这里,基本应该懂了吧,能看到这里的人,我只希望大家能也多分享一些(不论是技术还是任何其他事),感恩前人。有什么问题,请评论或者给我发私信,谢谢大家


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔明兴汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值