Kotlin 嵌套函数开发技巧详解

作者:长安皈故里 时间:2021-12-16 08:05:49 

1.嵌套函数

业务开发中,我们可能会遇到这样一个场景:一个函数只会被某一处多次调用,且不想让这个函数在该类的其他地方调用,这个时候就需要对这个函数的访问性进行进一步限制。

private是无法满足的,这个时候我们就可以使用嵌套函数提供更好的封装:

fun test1() {
   //被限制访问行的函数
   fun test2(content: String) {
       println(content)
   }
   test2("hahaha")
   test2("babababa")
   test2("uuuuuuu")
}

这时候,只有test1()能够被访问,test2()是无法被除了test1()外的其他地方进行访问的

不过这样test2()方法体过大会导致test1()方法太长,所以嵌套函数要根据具体场景选择性使用

2.@JvmOverloads快捷实现函数重载

Android自定义View时,一般需要定义三个构造方法:

class CustomView : View {
   constructor(context: Context) : super(context)
   constructor(context: Context, attributes: AttributeSet? = null) : super(context, attributes)
   constructor(context: Context, attributes: AttributeSet? = null, defStyleAttr: Int) : super(
       context,
       attributes,
       defStyleAttr
   )
}

每次自定义View都这样写过于麻烦,这个时候就可以借用@JvmOverloads实现运算符重载:

class CustomView @JvmOverloads constructor(
   context: Context,
   attributes: AttributeSet? = null,
   defStyleAttr: Int = 0
) : View(context, attributes, defStyleAttr) {
}

反编译成java代码看下:

Kotlin 嵌套函数开发技巧详解

可以看到,kotlin编辑器会自动帮助我们生成三个重载构造方法。

PS:当@JvmOverloads使用在基于已有的WebView、EditText等组件自定义View时,一定要注意第三个参数defStyleAttr默认值时不一定为0的,需要根据继承的父类组件填充正确的参数

3.延迟初始化lateinit var

日常开发中,我们会使用lateinit var实现属性的延迟初始化:

lateinit var mContent: String
mContent = "test test"

使用延迟初始化的属性,当我们不确定这个属性有没有被初始化,可以通过下面方式判断:

//判断mContent有没有被初始化
if (this::mContent.isLateinit) {
   Log.i("CustomView", "test: ")
}

4.@JvmField减少属性set和get方法的生成

定义一个变量:

var mData: String = ""

反编写成java代码:

Kotlin 嵌套函数开发技巧详解

可以看到编译器会自动帮助我们生成mData的set、get方法,如果不想要编译帮助我们生成属性的set、get方法,可以添加@JvmField注解:

@JvmField
var mData: String = ""

反编译成java代码:

Kotlin 嵌套函数开发技巧详解

这样系统就不会帮助我们生成get、set方法了,因为编译器将mData的访问修饰符改成了public

来源:https://juejin.cn/post/7083264557367427080#heading-1

标签:Kotlin,嵌套函数,开发技巧
0
投稿

猜你喜欢

  • SpringBoot中读取application.properties配置文件的方法

    2023-10-20 17:29:05
  • C#创建临时文件的方法

    2023-06-16 14:32:36
  • Android编程常用技巧实例总结

    2022-11-30 20:27:44
  • 解决Android Studio电脑不支持HAXM的问题

    2022-05-28 04:48:51
  • C#设计模式之Singleton模式

    2022-03-28 09:01:31
  • c# Thread类线程常用操作详解

    2021-09-20 21:35:51
  • MyBatis批量插入(insert)数据操作

    2023-09-21 00:03:54
  • java 分转元与元转分实现操作

    2023-05-13 16:47:22
  • IDEA的默认快捷键设置与Eclipse的常用快捷键的设置方法

    2023-04-09 18:32:40
  • java实现简单的webservice方式

    2023-11-25 03:59:58
  • Java+Nginx实现POP、IMAP、SMTP邮箱代理服务

    2023-11-26 10:31:47
  • 详解Android OkHttp完全解析

    2023-04-05 05:05:31
  • C#结合AForge实现摄像头录像

    2021-06-28 03:53:51
  • C# 创建高精度定时器的示例

    2023-03-09 12:35:58
  • Android编程设计模式之迭代器模式详解

    2023-06-07 01:25:42
  • RecyclerView实现侧滑拖拽功能

    2023-03-10 16:09:50
  • java基础之包装类的介绍及使用

    2023-01-10 17:45:29
  • Springboot Session共享实现原理及代码实例

    2022-12-16 03:29:52
  • SpringBoot整合SSO(single sign on)单点登录

    2022-02-02 03:39:40
  • Gradle进阶使用结合Sonarqube进行代码审查的方法

    2021-12-17 08:49:56
  • asp之家 软件编程 m.aspxhome.com