使用情景: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(){
}
}