enum枚举单例的使用

使用情景:java调用dll,在调用dll里面的接口之前,要先调用初始化函数;而这个初始化函数每次都需要执行1分钟才执行完,如果每次调用接口之前都调用一次初始化函数,显然太过浪费时间,很影响用户体验;故用单例模式解决此问题。

1.创建单例类:

/**
 * enum枚举单例的使用
 */
public enum PictureUtil {

    INSTANCE;
    private boolean isInit = false;

    private int init() {    //初始化函数,耗时较长
        System.out.println("开始初始化...");
        try {//模拟消耗资源
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int result = 0;//初始化成功返回0
        if(result == 0){
            isInit = true;
        }
        return result;
    }

    public int transfer(){  //转换函数
        if(!isInit){
            int res = init();
            System.out.println("核心初始化结果:"+res);
        }
        System.out.println("开始转换...");
        return 0;
    }

    public static void main(String[] args) {
        //在其他类使用示例
        PictureUtil pictureUtil = PictureUtil.INSTANCE;//获取单例
        pictureUtil.transfer();//转换函数
    }
}

2.在controller里面调用单例的方法

package com.example.demo2.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class helloController {
    @RequestMapping("/haha")
    public String haha() {
        PictureUtil pictureUtil = PictureUtil.INSTANCE;//获取单例
        int result = pictureUtil.transfer();
        return "成功:"+result;
    }
}

结果:

多次访问http://localhost:8080/haha

第一次访问后台打印的是:【先执行初始化函数,在执行转换函数】

开始初始化...
核心初始化结果:0
开始转换...

第二次以及之后的访问后台打印的是:【直接执行转换函数,省去了执行初始化函数的时间】

开始转换...

总结使用方法:

public enum SingletonDemo4 {
     
    //枚举元素本身就是单例
    INSTANCE;
     
    //添加自己需要的操作
    public void singletonOperation(){     
    }
}

 

你可能感兴趣的:(Java)