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编辑器会自动帮助我们生成三个重载构造方法。
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代码:
可以看到编译器会自动帮助我们生成mData的set、get方法,如果不想要编译帮助我们生成属性的set、get方法,可以添加@JvmField注解:
@JvmField
var mData: String = ""
反编译成java代码:
这样系统就不会帮助我们生成get、set方法了,因为编译器将mData的访问修饰符改成了public
来源:https://juejin.cn/post/7083264557367427080#heading-1


猜你喜欢
- 1、准备使用redis实现分布式锁,需要用的setnx(),所以需要集成Jedis需要引入jar,jar最好和redis的jar版本对应上,
- 说明:在填写表数据时当输入完一个文本框后,输入下一个文本框时需要用Tab键切换,但是有的人喜欢用Enter键切换下一个,此方法是Enter取
- String replace replaceFirst repaceAll区别replace(char oldChar, char newC
- 文件移动是计算机资源管理常用的一个操作,这在操作系统中可以通过文件的剪切与复制或鼠标拖动来实现。但是在Java文件的编程实现中,大多是通过复
- 目录一、Lambda 表达式简介1、什么是 Lambda 表达式2、为什么需要 Lambda 表达式二、函数式接口和定义1、什么是函数式接口
- private void WorkflowConfigure_FormClosing(object sender, FormClosingE
- 一、引言在刷算法的时候经常需要对数组进行排序,第一反应就是直接使用java.util包下的Arrays.sort()方法直接排序。但在刷算法
- 在java项目开发中。最开始换行符大家一般是在idea中设置新文件为LF,并且对旧文件通过IDEA下方的点击来更换换行符。很显然,对于几千文
- 实践过程效果代码public partial class frmSplit : Form{ public frmS
- 本文实例为大家分享了基于servlet实现统计网页访问次数的具体代码,供大家参考,具体内容如下一、基础知识(1)ServletContext
- 本文实例为大家分享了Android实现聊天界面的具体代码,供大家参考,具体内容如下文件目录在app下的build.gradle中添加依赖库(
- 本篇要点简单描述浮点数十进制转二进制精度丢失的原因。介绍几种创建BigDecimal方式的区别。整理了高精度计算的工具类。学习了阿里巴巴Ja
- 之前花了几天去研究怎么使用netty做一个网关服务器,虽然最后还是没能用上我做的网关,但是呢netty是会用了,总结一下netty和spri
- 十进制转二进制正整数转二进制除2取余,逆序排列,高位补零。示例:十进制255 = 二进制1111 1111计算过程:255/2=127===
- 一、前言装饰模式实际上是一直提倡的组合代替继承的实践方式,个人认为要理解装饰者模式首先需要理解为什么需要组合代替继承,继承又是为什么让人深恶
- LinkedBlockingDeque介绍LinkedBlockingDeque是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO
- 今天练习C#的一个功能,就是将一个字符串时行翻转显示如:string str = "Insus.NET";翻转成为:st
- 我自己在使用的过程中遇见的问题,百度找了很久才找到合适的方法。报错如下:Emulator: emulator: ERROR: Unknown
- 在开发中我们经常需要把我们的应用设置为全屏,有两种方法,一中是在代码中设置,另一种方法是在配置文件里改!一、在代码中设置:package c
- 继上一次利用Servlet实现图片上传,这次利用基于MVC的Struts框架,封装了Servlet并简化了JSP页面跳转。JSP上传页面上传