Kotlin 嵌套函数开发技巧详解

目录
  • 1.嵌套函数
  • 2.@JvmOverloads快捷实现函数重载
  • 3.延迟初始化lateinit var
  • 4.@JvmField减少属性set和get方法的生成

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

以上就是Kotlin 嵌套函数开发技巧详解的详细内容,更多关于Kotlin 嵌套函数的资料请关注我们其它相关文章!

(0)

相关推荐

  • Kotlin标准库函数使用分析及介绍

    目录 1.apply 函数 2.let 函数 3.run函数 4.with 函数 5.also 6.takeIf 7.takeUnless 1.apply 函数 apply函数可以看做是一个配置函数.针对apply函数的调用者做一些配置,并把调用者返回. 示例:下面apply的调用者是file,调用完之后,返回的还是file,并在apply函数中,针对file做了一些配置. val file = File("d:\\hello.txt").apply { setWritable(tru

  • Kotlin函数使用示例教程

    目录 我们先看看简单的函数 我们写一个求和函数 函数头 函数体 调用函数非常简单 反编译Java源代码步骤 接下来我们来看看匿名函数 这是接口的声明 我们先看看简单的函数 // 前面的文章我们了解到它是入口函数 fun main() { } // 对应的Java 语言,熟悉的Java 的朋友会发现,哈哈,这就是一个Java静态方法 // 我们通过两种语言的对比,能够对函数有一个更好的理解 public static final void main() { } // 如果没有 Java 基础,不适

  • Kotlin扩展函数超详细介绍

    目录 1.扩展函数 2.infix 关键字 3.扩展函数文件 4.重命名扩展函数 1.扩展函数 1)当我们没法接触某个类的定义,或者某个类没有用open修饰无法继承时,我们可以通过扩展函数,来实现该类功能的扩展.扩展函数,可以扩展自定义类.String类以及kotlin标准库中的其他类. 2)定义扩展函数和定义一般函数差不多.唯一的不同就是,定义扩展函数时,除了函数定义外,还需指定给哪个类进行扩展.如:fun String.addExtention() = "Kotlin: ".plu

  • Kotlin函数式编程超详细介绍

    目录 1.函数式编程 2.函数类别 3.变换函数(transform) 4.过滤函数(filter) 5.合并函数(combine) 1.函数式编程 我们都知道java是面向对象编程范式.在java的世界,一切皆对象. 函数式编程范式是有抽象数学的lambda演算发展而来,主要依赖高阶函数返回的数据,这些高级函数专用于处理各种集合,可以方便的联合多个函数构建链式操作,以创建复杂的计算行为. 所谓高级函数就是以函数为参数或返回值是函数的函数.这点,前面的文章,有过简单介绍. 2.函数类别 一个函数

  • Kotlin 嵌套函数开发技巧详解

    目录 1.嵌套函数 2.@JvmOverloads快捷实现函数重载 3.延迟初始化lateinit var 4.@JvmField减少属性set和get方法的生成 1.嵌套函数 业务开发中,我们可能会遇到这样一个场景:一个函数只会被某一处多次调用,且不想让这个函数在该类的其他地方调用,这个时候就需要对这个函数的访问性进行进一步限制. private是无法满足的,这个时候我们就可以使用嵌套函数提供更好的封装: fun test1() { //被限制访问行的函数 fun test2(content:

  • iOS中的应用启动原理以及嵌套模型开发示例详解

    程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示. (3)通过[UIApplicationsharedApplication]可以获得这个单例对象 (4) 一个iOS程序启动后创建的第一个对象就是UIAp

  • JavaScript中的alert()函数使用技巧详解

    在JavaScript代码中,可以使用window对象的alert()函数来显示一段文本,从而进行程序的调试,或者向用户警示相关信息: 复制代码 代码如下: //Use window object's alert() function window.alert("sample text"); 这一写法可以简化为直接使用alert()函数: 复制代码 代码如下: //Simplified alert() usage alert("sample text"); 如果需要

  • kotlin开发cli工具小技巧详解

    目录 脚手架 开搞 开发调试 jcommander Main 函数声明 压缩模板 放飞自我 生成最终产物 结尾 脚手架 脚手架是为了保证各施工过程顺利进行而搭设的工作平台 而在程序开发过程中,每个工程或者说公司也都需要一个脚手架工具.通过脚手架命令行的形式简化开发流程,避免发生一些人为的相对低级的问题,所以这个也就是为什么叫做脚手架的原因吧. 而由于每个公司的代码规范都不同,一般情况下会主动让开发同学进行工程方面的cv操作,就是成本高并且容易出错.这也就是为什么我们打算写一些这样的工具的原因.

  • web开发之对比时间大小的工具函数的实例详解

    web开发之对比时间大小的工具函数的实例详解 js时间大小比较,格式yyyy-MM-dd hh:mm:ss 把时间比较封装成一个工具函数: /** * 比较两个时间的大小 * 时间格式:yyyy-MM-dd hh:mm:ss * @param {Object} beginTime 开始时间 * @param {Object} endTime 结束时间 */ var getDataLarge = function(beginTimeString,endTimeString){ var b = be

  • vue前端开发层次嵌套组件的通信详解

    目录 前言 示例 小结 前言 vue父子组件之间通过props很容易的将父组件的值传递给子组件,如果一个组件嵌套很多层,每一层之间度需要同props进行传值,很麻烦,且不易维护 示例 [示例]A组件中使用了B组件,B组件中使用了C组件,C组件需要使用A组件的数据text及使用A组件的方法getmethod.A组件代码如下: <template> <div> <P>这是A组件</P> <v-comb></v-comb> </div

  • Python必备技巧之函数的使用详解

    目录 1.如何用函数 2.默认参数陷阱 2.1针对可变数据类型,不可变不受影响 3.名称空间和作用域 4.闭包函数 5.函数的参数 5.1定义阶段 5.2调用阶段 6.装饰器:闭包函数的应用 6.1装饰器的实现必须遵循两大原则 6.2装饰器语法糖 6.3无参装饰器 6.4有参装饰器 7.题目 1.如何用函数 先定义后调用,定义阶段只检测语法,不执行代码 调用阶段,开始执行代码 函数都有返回值 定义时无参,调用时也是无参 定义时有参,调用时也必须有参 2.默认参数陷阱 2.1针对可变数据类型,不可

  • Android开发Kotlin实现圆弧计步器示例详解

    目录 效果图 定义控件的样式 自定义StepView 绘制文本坐标 Android获取中线到基线距离 效果图 定义控件的样式 看完效果后,我们先定义控件的样式 <!-- 自定义View的名字 StepView --> <!-- name 属性名称 format 格式 string 文字 color 颜色 dimension 字体大小 integer 数字 reference 资源或者颜色 --> <declare-styleable name="StepView&q

  • Android 开发与代码无关技巧详解

    目录 1.如何找到代码 (1)无敌搜索大法 (2)log输出大法 (3)profiler查看大法 (4)万能法找到页面 2.如何解决bug (1)先看再想最后动手 (2)改变现状 (3)是技术问题还是业务问题 (4)张张嘴远胜于动动手 (5)bug解决不了,那就解决提出bug的人 (6)解决了bug之后 3.如何实现不会的功能 (1)不要急着拒绝 (2)大事化小小事化了 心态要稳,天塌了有个高的顶着 1.如何找到代码 作为客户端的开发,工作中经常遇到,后端的同事来帮忙找接口详情.产品经理来询问之

  • 开发中避免延时操作技巧详解

    目录 前言 使用延时的场景 获取view的宽高 定时查询服务器结果 广播顺序 延时初始化 使用延时的场景 小心使用延时 前言 开发中我们或多或少会涉及到一些场景需要使用延时操作,而延时操作其实并不是一个很好的选择,并不是一个很好的方案,因为它不可控,也可能产生时序的逻辑问题.这次就来盘点一些使用延时操作的场景和如何去避免,本次内容比较基础. 使用延时的场景 在刚接触开发的时候,我们无脑解决问题的方案基本只有两种,异常捕获和延时.异常捕获容易理解,当碰到崩溃又分析不出原因时,往往加个try-cat

随机推荐