如何将一个工具类改为单例模式
遇到的问题:业务中需要将富文本转化为纯文本,于是搜到一个工具类如下
public class Html2Text extends HTMLEditorKit.ParserCallback{
StringBuffer s;
public void parse(String str) {
try (InputStream iin = new ByteArrayInputStream(str.getBytes());
Reader in = new InputStreamReader(iin);
){
s = new StringBuffer();
ParserDelegator delegator = new ParserDelegator();
// the third parameter is TRUE to ignore charset directive
delegator.parse(in, this, Boolean.TRUE);
}catch (Exception e){
log.error("Html2Text parse error",e);
}
}
@Override
public void handleText(char[] text, int pos) {
s.append(text);
}
public String getText() {
return s.toString();
}
public String getContent(String str) {
this.parse(str);
return this.getText();
}
}
使用的时候,每次都 new Html2Text()
然后调用 getContent()方法。
这种又个弊端,每次都要新建一个实例,接口调用量大的时候比较耗性能。 于是想着,怎么能简单改造一下,改造成单例,避免重复创建对象。
脑子里想了面试时候用到的,懒汉模式,饿汉模式,双重检查锁。。。
来一起回忆一下
懒汉模式
public class Singleton2 {
private volatile static Singleton2 singleton; // 5 volatile用来防止多线程下重排序
private Singleton2() {
System.out.println("懒汉式单例初始化!");
}
public static Singleton2 getInstance () {
if(singleton ==null) { // 1
synchronized(Singleton2.class) { // 2
if(singleton == null) { // 3
singleton = new Singleton2(); //4
}}
}
return singleton;
}
饿汉模式
package com.design.singleton;
/**
* 饿汉单例模式
*/
public class EagerSingleton {
private static final EagerSingleton eagerSingleton = new EagerSingleton();
private EagerSingleton(){
}
public static EagerSingleton getInstance(){
return eagerSingleton;
}
}
我们以饿汉模式改造
@Slf4j
public class Html2Text extends HTMLEditorKit.ParserCallback{
private static final Html2Text html2Text = new Html2Text();
static StringBuffer s;
public void parse(String str) {
try (InputStream iin = new ByteArrayInputStream(str.getBytes());
Reader in = new InputStreamReader(iin);
){
s = new StringBuffer();
ParserDelegator delegator = new ParserDelegator();
// the third parameter is TRUE to ignore charset directive
delegator.parse(in, this, Boolean.TRUE);
}catch (Exception e){
log.error("Html2Text parse error",e);
}
}
@Override
public void handleText(char[] text, int pos) {
s.append(text);
}
public String getText() {
return s.toString();
}
public static String getContent(String str) {
html2Text.parse(str);
return html2Text.getText();
}
}