转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/87941461
本文出自【赵彦军的博客】
无参单例模式—线程安全
在 Java 中单例模式有很多种写法,比如懒汉模式,恶汉模式。但是在 Kotlin 种的单例模式就简单很多,用 object 修饰的类就是单例。
object User {
var name: String? = null
fun run() {
}
}
你们看,是不是简单很多,我们把 kotlin 编译成 java 代码来看看
public final class User {
@Nullable
private static String name;
public static final User INSTANCE;
@Nullable
public final String getName() {
return name;
}
public final void setName(@Nullable String var1) {
name = var1;
}
public final void run() {
}
static {
User var0 = new User();
INSTANCE = var0;
}
}
可以看到 User
类中有 INSTANCE
实例,用 static
静态代码块包裹,在第一次使用的时候初始化。
那么这个单例模式怎么使用呢?
在 kotlin 中使用
User.name = "赵彦军" //调用成员变量
User.run() //调用成员函数
在 Java 中使用也很简单,但是不能像 kotlin 中那些直接调用,需要加一个 INSTANCE
//调用成员变量
User.INSTANCE.setName("zhaoyanjun");
User.INSTANCE.getName();
//调用成员函数
User.INSTANCE.run();
懒加载单例模式—线程安全
class Manager private constructor() {
companion object {
val instance by lazy {
Manager()
}
}
fun run() {
//running now
}
}
使用方式
//kotlin 版本
Manager.instance.run()
//java版本
Manager.Companion.getInstance().run();
有参单例模式—线程安全
首先创建单例模式工具类 SingletonHolder
open class SingletonHolder<out T: Any, in A>(creator: (A) -> T) {
private var creator: ((A) -> T)? = creator
@Volatile private var instance: T? = null
fun getInstance(arg: A): T {
val i = instance
if (i != null) {
return i
}
return synchronized(this) {
val i2 = instance
if (i2 != null) {
i2
} else {
val created = creator!!(arg)
instance = created
creator = null
created
}
}
}
}
然后创建单例模式实体类
import android.content.Context
class Manager private constructor(context: Context) {
init {
// Init using context argument
}
companion object : SingletonHolder<Manager, Context>(::Manager)
fun run() {
//running now
}
}
使用方式
//kotlin 版本
Manager.getInstance(baseContext).run()
//java版本
Manager.Companion.getInstance(context).run();
反编译代码
import android.content.Context;
import kotlin.Metadata;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.internal.DefaultConstructorMarker;
public final class Manager {
public static final Manager.Companion Companion = new Manager.Companion((DefaultConstructorMarker)null);
public final void run() {
}
private Manager(Context context) {
}
// $FF: synthetic method
public Manager(Context context, DefaultConstructorMarker $constructor_marker) {
this(context);
}
public static final class Companion extends SingletonHolder {
private Companion() {
super((Function1)null.INSTANCE);
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
个人微信号:zhaoyanjun125 , 欢迎关注