java单例懒汉加载最为推荐方式

 

package com.tcl.scm.controller;

/**
 * @description:
 * @author: wuyuhuan
 * @create: 2021-02-18
 */
public class testLazyLoad {

    static {
        System.out.println("主类==");
    }

    {
        System.out.println("主类2==");
    }

    private  testLazyLoad() {
        //直调用了一次
        System.out.println("主类构造方法调用");
    }

    //静态内部类
    private static class lazyLoadSerachBase {

        static {
            System.out.println("1--内部类被初始化");
        }

        {
            System.out.println("1.2--内部类被初始化");
        }

        public lazyLoadSerachBase(){
            System.out.println("静态内部类被初始化");
        }

        private static final testLazyLoad serachBase = new testLazyLoad();
    }

    //内部类(在这里没作用,用于对比)
    private class notStatic {
        //不能加static--Inner classes cannot have static declarations
        {
            System.out.println("2--内部类被初始化");
        }
        public notStatic(){
            System.out.println("内部类被初始化");
        }
    }

    public static testLazyLoad getSerachBase() {
        return lazyLoadSerachBase.serachBase;
    }

    public static void main(String[] args) {
        System.out.println(1/3+2-3-2+10/2+518);//520
        System.out.println(testLazyLoad.getSerachBase());
        System.out.println(testLazyLoad.getSerachBase());
    }


}

控制台打印:

主类==
520
1--内部类被初始化
主类2==
主类构造方法调用
com.tcl.scm.controller.testLazyLoad@78e03bb5
com.tcl.scm.controller.testLazyLoad@78e03bb5

用这个方式主要原因:

JVM对内部静态类(内部类也是)的处理方式不同。它们保持隐藏,直到实际使用时才初始化实例对象

 


补充:使用枚举可以天然的防止反射和反序列化调用。具体操作另寻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值