Kotiln单例模式

本文详细介绍了Kotlin中实现单例模式的五种常见方法:加载类时创建、懒加载、同步锁、双重校验和静态内部类写法,并分析了各自的优缺点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kotlin中单例常用的五种写法

1.加载类时创建单利
Java实现

public class Config{
 private static Config INSTANCE=new Config();
 private Config(){
 //构造函数
 }
 public static Config getInstance(){
 return INSTANCE;
 }
}

Kotlin实现

object Config{}

上面这种写法简单粗暴,直接在加载类的时候创建,但这样会拖慢启动进程,因此,可以在用到的时候再加载,比如下面这种写法

2.懒加载写法
Java实现

public class Config{
 private static Config INSTANCE;
 private Config(){
 //构造函数
 }
 public static Config getInstance(){
 if(null==INSTANCE){
 INSTSANCE=new Config();
 }
 return INSTANCE;
 }
}

Kotlin实现

public class Config{
 companion object{
 val instance by lazy(LazyThreadSafetyMode.NONE){
  Config()
 }
 }
}

懒加载虽然避免在加载类的时候创建,但是线程不安全,如果同时多个类获取单利,有可能会创建多个单利,因此可以在创建单利的时候加线程锁,比如下面这种写法:

3.同步锁写法
Java实现

public class Config{
 private static Config INSTANCE;
 private Config(){
 //构造函数
 }
 public static synchronized Config getInstance(){
 if(null==INSTANCE){
  INSTANCE=new Config();
 }
 return INSTANCE;
 }
}

Kotiln实现

class Config{
 companion object{
 private var instance:Config?=null
 @Synchronized
 fun get():Config{
  if(nnull==instance) instance=Config()
  return instance
 }
 }
}

同步锁避免单利不会被重复创建,但是同步锁

4.双重校验写法
Java实现

public class Config{
 private static volatile Config INSTANCE;
 private Config(){
 //构造函数
 }
 public static Config getInstance(){
 if(null==INSTANCE){
  synchronized(Config.class){
  if(null==INSTANCE){
   INSTSANCE=new Config();
  }
  }
 }
 return INSTANCE;
 }
}

Kotlin实现

class Config{
 companion object{
 val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED){
  Config()
 }
 }
}

5.静态内部类写法
这种写法避免了类加载的时候初始化单利,同时将同步锁问题交给虚拟机处理,算得上是最优雅的写法,Java和Kotlin写法几乎是一模一样
Java实现

public class Config{
 private static class Helper{
 private static Config INSTANCE=new Config();
 }
 private Config(){
 //构造函数
 }
 public static Config getInstance(){
 return Helper.INSTANCE;
 }
}

Ktotiln实现

class Config private constructor(){
 companion object{
 fun getInstance = Helper.instance
 }
 private object Helper{
 val instance = Config()
 }
}
### Android Kotlin 开发教程 #### 创建一个新的 Android 项目 为了创建新的 Android 应用程序,在 Android Studio 中选择 “Start a new Android Studio project”,接着选择模板,例如 Empty Activity。这会自动生成一些基本文件和代码片段。 #### 添加依赖项 确保 `build.gradle` 文件中包含了必要的库支持: ```gradle dependencies { implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0' } ``` 此设置允许开发者利用 Kotlin 的标准库功能[^1]。 #### 编写简单的应用程序逻辑 下面是一个展示如何在 MainActivity.kt 文件内实现点击按钮改变 TextView 文本的例子: ```kotlin import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { textView.text = "Hello, Kotlin!" } } } ``` 上述代码展示了如何通过合成扩展简化视图绑定操作,并响应 UI 组件事件来更新界面显示的内容。 #### 使用协程处理异步任务 Kotlin 协程提供了一种更简单的方式来管理后台线程上的长时间运行的任务而不阻塞主线程。这里有一个例子说明怎样发起网络请求并解析 JSON 数据: ```kotlin import kotlinx.coroutines.* import org.json.JSONObject import java.net.URL fun fetchJsonData(urlString: String): Deferred<JSONObject> = GlobalScope.async(Dispatchers.IO) { val url = URL(urlString) val jsonResult = JSONObject(url.readText()) jsonResult } // 调用方式如下: GlobalScope.launch(Dispatchers.Main) { try { val jsonData = fetchJsonData("http://example.com/api").await() // 处理获取到的数据... } catch (e: Exception) { e.printStackTrace() } } ``` 这段代码演示了如何定义一个挂起函数用于执行 I/O 操作以及如何在线程池之外调度这些工作以保持应用流畅度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值