首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin 基础 | 委托及其应用

运用 Kotlin 的委托语法可以进一步简化Feather类: class Feather(private var accessory: Accessory): Accessory by accessory...,表示类委托,即把类的实现委托一个对象,该对象必须实现和类相同的接口,在这里是Accessory接口。...对于 var 修饰的读写变量进行属性委托时,被委托对象必须实现getValue()和setValue()接口,即定义如何读写变量值。..., property: KProperty): T = value getValue()被声明为Lazy类的扩展函数。这是 Kotlin 独有的在类体外为类新增功能的特性。...属性名将自动作用于 map 的键。 总结 Kotlin 委托分为类委托和属性委托。它们都通过关键词by来进行委托。 类委托可以用简洁的语法将类的实现委托给另一个对象,以减少模板代码。

98930

干货 | 携程机票 App KMM 跨端生产实践

Kotlin Native SDK 已经预先内置了 iOS 系统所有的 API,开发人员需要手工处理的是将 Kotlin 代码与自行编写的 Objective-C 代码或其他第三方库代码进行桥接。...,对象子图机制可以总结为以下几点: 1)每个对象都与其诞生时所在的线程绑定,一旦在其他线程访问该对象,即监测到该对象的对象子图中记录的线程 id 与当前线程不一致,程序立刻 crash。...这个问题是否解决将决定 KMM 能否用于生产环境,经过我们的研究和评估后制定了一系列的解决方案。...这个问题带来的另一个问题是,在 Kotlin 工程中,所有的 Kotlin 对象都无法获取自身的 class 对象。...在 Kotlin/Native 中,object 只能存在两种情况,要么是冻结的(即内部所有成员都是不可变的),要么必须加 @ThreadLocal 注解,但这样的话它就会变成线程私有的,来看以下代码:

3.7K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin入门(29)任务Runnable

    任务Runnable定义了一个可以独立运行的代码片段,通常用于界面控件的延迟处理,比如有时为了避免同时占用某种资源造成冲突,有时则是为了反复间隔刷新界面从而产生动画效果。...下面是个将任务对象改写后的Kotlin代码:     private val counter = Runnable {         count++         tv_result.text =...run方法是有代价的,虽然表面上代码变得简洁,但是并不拥有类的完整结构,其内部的this关键字不再表示任务类自身,而是表示宿主类即Activity活动类了。...鉴于这点变化,该方式内部不可再调用处理器的post或者postDelayed方法,意味着此时任务实例无法重复调用自身。因此,采取了匿名函数方式的任务对象,适用于不需要重复刷新的场合。...匿名函数虽然无法重复调用,但是尚且允许在不同地方多次调用,而匿名实例只能在它待过的地方昙花一现,因此还是要根据实际的业务要求来选择合适的任务方式。 点此查看Kotlin入门教程的完整目录

    1.9K20

    Kotlin的互操作——Kotlin与Java互相调用

    Kotlin调用Java Kotlin在设计时就考虑了与Java的互操作性。可以从Kotlin中自然地调用现有的Java代码,在Java代码中也可以很顺利地调用Kotlin代码。...与Java一样,Kotlin在运行时不保留泛型,也就是对象不携带传递到它们的构造器中的类型参数的实际类型,即ArrayList()和ArrayList()是不能区分的...如果Java类有多个接受函数式接口的方法,那么可以通过使用将Lambda表达式转换为特定的SAM类型的适配器函数来选择需要调用的方法。...④ 静态方法 Kotlin将包级函数表示为静态方法。如果对这些函数使用@JvmStatic进行标注,那么Kotlin还可以为在命名对象或伴生对象中定义的函数生成静态方法。...Kotlin在JVM虚拟机中运行时会检查所有的公共函数,可以检查非空值,这时候就可以通过NullPointerException得到Java中的非空值代码。

    3.8K10

    Kotlin 机制你都了解吗?

    什么是 extension(扩展)函数 ---- Kotlin 可以对一个类的属性和方法进行扩展,对被扩展的类代码本身不会造成任何影响。...lateinit 只能用于修饰变量 var,不能用于可空的属性和 Java 的基本类型。 lateinit 可以在任何位置初始化并且可以初始化多次。...伴生对象的总结 ---- 类似于 Java 中使用类访问静态成员的语法。因为 Kotlin 取消了 static 关键字,所以 Kotlin 引入伴生对象来弥补没有静态成员的不足。...-->show Kotlin Bytecode,将 Person 类反编译成 java 类得到: ?...相当于 java 中的 static final 修饰。该val关键字还用于只读属性。但是 const 和之间的主要区别在于 val,val 属性也可以在运行时进行初始化,即不可变变量。 10.

    80430

    干货 | Kotlin超棒的语言特性

    为了获得更好的空安全,Kotlin中所有的对象都明确指明可空或者非空属性,即这个对象是否可能为null。 ? 对于可空类型的对象,直接调用其方法,在编译阶段就会报错。...做到了字符串的所见即所得。 ? 同时,Kotlin还引入了字符串模板,可以在字符串中直接访问变量和使用表达式: ?...Kotlin能够扩展一个类的新功能,这个扩展是无痕的,即我们无需继承该类或使用像装饰者的设计模式,同时这个扩展对使用者来说也是透明的,即使用者在使用该类扩展功能时,就像使用这个类自身的功能一样的。...第一个是对象表达式,可以直接创建一个继承自某个(或某些)类型的匿名类的对象,而无须先创建这个对象的类。这一点跟Java是类似的: ? 第二,对象字面量。...这个特性将数字字面量,字符串字面量扩展到一般性对象中了。对应的场景是如果我们只需要“一个对象而已”,并不需要特殊超类型。

    1.5K40

    名词小解

    例如,Scala中的每个值都是一个对象,包括基本数据类型(即布尔值、数字等)在内,连函数也是对象。...Scala允许定义新类的时候重用"一个类中新增的成员定义(即相较于其父类的差异之处)"。Scala称之为mixin类组合。   ...它用scalac这个编译器把源文件编译成Java的class文件(即在JVM上运行的字节码)。你可以从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的代码。   ...总而言之,Scala是一种函数式面向对象语言,它融汇了许多前所未有的特性,而同时又运行于JVM之上。...Groovy 是 用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。

    79800

    Kotlin入门(15)独门秘笈之特殊类

    除了与Java共有的抽象类,Kotlin还新增了好几种特殊类,这些特殊类分别适应不同的使用场景,极大地方便了开发者的编码工作,下面就来看看Kotlin究竟提供了哪些独门秘笈。...WINTER } 枚举类内部的枚举变量,除了可以直接拿来赋值之外,还可以通过枚举值的几个属性获得对应的信息,例如ordinal属性用于获取该枚举值的序号,name属性用于获取该枚举值的名称。...get/set方法; 3、自动提供equals方法,用于比较两个数据对象是否相等; 4、自动提供copy方法,允许完整复制某个数据对象,也可在复制后单独修改某几个字段的值; 5、自动提供toString...方法,用于打印数据对象中保存的所有字段值; 功能如此强大的数据类,犹如葵花宝典,让你功力倍增。...equals方法,用于判断两个对象是否一样 var result = if (lotus2.equals(lotus)) "相等" else "不等" tv_class_secret.text

    1.3K30

    Kotlin 学习笔记(三)

    在上一篇中我们见识到了 Kotlin 语言所特有的几种类——数据类、密闭类等,也熟悉了 Kotlin 中集合的常用运算符,以后再也不用担心 Kotlin 集合的相关问题了。...最后,这种反引号的用法不推荐使用!了解即可! 4. Kotlin 对象比较 在 Java 中,要比较两个对象是否相等,通常用的是 == 或 equals 方法。...Java 中的 == 运算符比较的是两个对象本身的值,即两个对象在内存中的首地址。如果是两个字符串,就是比较的这两个字符串存储的地址是否是同一个。...Java 中的 equals 方法比较的是两个对象中各个属性值的是否相同。如果是两个字符串,就是比较的两字符串所包含的内容是否相同。...在 Kotlin 语言中,判断两个对象是否相等用的是 == 和 ===。没错,两个等号和三个等号。

    61110

    Kotlin与Java互操作

    可以从Kotlin中自然地调用现有的Java代码,在Java代码中也可以很顺利地调用Kotlin代码。例如,在Kotlin中调用Java的Util的list库。...可针对 JSR-305 注解编译库,但不需要为库的消费者将注解构件(如 jsr305.jar)指定为编译依赖。Kotlin 编译器可以从库中读取 JSR-305 注解,并不需要该注解出现在类路径中。...与Java一样,Kotlin在运行时不保留泛型,也就是对象不携带传递到它们的构造器中的类型参数的实际类型,即ArrayList()和ArrayList()是不能区分的。...静态字段 在命名对象或伴生对象时,声明的 Kotlin 属性会在该命名对象或包含伴生对象的类中包含静态幕后字段。通常这些字段是私有的,但可以通过以下方式之一暴露出来。...如果对这些函数使用@JvmStatic进行标注,那么Kotlin还可以为在命名对象或伴生对象中定义的函数生成静态方法。

    3.5K30

    Kotlin安卓开发学习(3)

    Kotlin会根据主构造函数中的参数自动生成包括equals(),hashCode(),toString()等固定无实际意义的方法自动生成。并当类没有任何代码时,尾部大括号可以省略。...单例类是Kotlin特有的功能,其实现的是最常用、最基础的设计模式之一的单例模式,它可以避免创建重复的对象。比如我们希望某个类在全局最多只能拥有一个实例,这时就可以使用单例模式。...{ it.length } map函数是最常用的函数式API之一,它用于将集合中的每一个元素映射成为另一个值,如我们希望集合中所有字母变为大写: val newList = list.map { it.toUpperCase....map { it.toUpperCase() } //全部大写表示 any和all函数前者用于判断集合中是否至少存在一个元素满足条件,后者判断是否所有元素都满足条件...,因为Kotlin默认所有的参数和变量都是不可为空的,所有传入的study也不可能为空,当传入null时,会提示错误。

    52610

    Android经典面试题之Kotlin的==和===有什么区别?

    在 Kotlin 中,== 和 === 是两个不同的操作符,它们用于比较两个值是否相等,但它们的行为和用途有所不同。 == 操作符: == 是一个相等性比较操作符,用于比较两个变量的值是否相等。...当用于基本数据类型(如 Int、Double、Char 等)时,== 直接比较它们的值。 当用于对象引用时,== 比较的是两个引用是否指向同一个对象实例(即它们是否是同一个对象)。...在 Kotlin 中,=== 通常用于特定的场景,比如在某些情况下需要确保对象的唯一性。...它返回一个整数,如果调用对象小于、等于或大于参数,则分别返回负数、零或正数。 7、 equals 方法: Any 类中的 equals 方法用于比较两个对象是否相等。...默认实现使用 === 进行比较,但通常在自定义类中重写这个方法来比较对象的内容。 8、 contentEquals 方法: 用于比较两个集合的内容是否相等,不考虑元素的顺序。

    18610

    IDEA 2021年首个新版本发布,重要更新速览

    在开启多个选项卡以垂直拆分编辑器时,您可以双击其中任意一个选项卡,将当前编辑器的窗口最大化显示。 您的 IDE 现可支持采用 Goessner 或 Jayway 语法的 JSONPath 表达式。...如果您使用的函数需要配合类型参数,新 IDE 会将正确的类型参数添加至之前的代码当中。 UML 类图现可用于编译为 JVM 的 Kotlin 代码。...IntelliJ IDEA 调度器现可在 Kotlin 中评估 get 表达式,并将其显示在 Varaiables 视图当中。...fileGuid=Rh53J74517Q9BKqm 10数据库工具 添加一个 UI,用于在对象修复过程中编辑 grant 授权。...如果您使用我们的浅色主题,则 UML 图表也将更新为新的配色方案。 Swagger 现可支持带有外部文件引用($ref)的规范,并在 Structure 视图中为规范文件提供更多节点。

    1.7K40

    Kotlin委托

    Kotlin中有委托,这个C#中也有,不过对于学Java的童鞋来说,这是什么鬼啊,到底是干什么用的… 在委托模式中,当有两个对象参与处理同一个请求是,接受请求的对象将请求委托给另一个对象来处理。...委托模式已证明是实现继承的一个很好的替代方式。Kotlin中委托分为类委托和委托属性,Kotlin官方库也封装了一些常用的委托。...类委托 类 Derived 可以继承一个接口 Base,并将其所有共有的方法委托给一个指定的对象,也就是说把类 Derived 因继承而需要实现的方法委托给一个对象,从而不需要在该类内显式的实现: interface...getValue() 或/和 setValue() 函数可以通过委托类的成员函数提供或者由扩展函数提供。 当你需要委托属性到原本未提供的这些函数的对象时后者会更便利。...Vetoable 他让你决定这个值是否需要保存,用于在真正保存之前的一些条件判断。

    1.5K30

    Kotlin 漫谈系列之类与继承

    不过,Kotlin 中可以用 object 关键字直接定义一个对象,在类内部,我们可以用 companion 为类声明一个伴生对象。...在 JVM 平台,如果使用 @JvmStatic 注解,你可以将伴生对象的成员生成为真正的静态方法和字段。 不过你们的类方法还可以被子类重写,这个在 Java 里也不行。...在 Kotlin 里面,所有的非抽象类默认都是静态的,也就是相当于 Java 中的 final。...伴生对象 Kotlin 中可以用 object 关键字直接定义一个对象,在类内部,我们可以用 companion 为类声明一个伴生对象。...在 JVM 平台,如果使用 @JvmStatic 注解,你可以将伴生对象的成员生成为真正的 静态方法和字段。更详细信息请参见Java 互操作性一节。

    3.7K40

    Kotlin Vocabulary | 唯一的 "对象"

    在 Java 语言中,static 关键字主要用于表明方法和属性是属于某个对象,而不是属于对象的实例。...static 关键字也用于创建 Singleton (单例),单例模式是非常常见的设计模式,它可以帮您创建某个对象的唯一实例,并且其它对象也可以访问和分享该实例。...要使类有且仅有一个实例,需要将构造方法定义为私有的 (private),并且创建一个公共可访问的静态对象引用。与此同时,您一般不会在启动的时候创建单例,因为使用单例的对象在创建的时候非常耗费资源。...如果您创建类的时候使用的是 object 关键字而不是 class,Kotlin 编译器会将构造方法设置为私有的,并且为 object 类创建一个静态引用,同时在一个静态代码块里初始化该引用。...这样一来,object 即保证了线程安全,也实现了首次访问的延迟创建。 我们来看一下反编译的 Kotlin 字节码,深入了解一下底层是如何实现的。

    1.5K60

    由浅入深,详解 LiveData 的那些事

    ,内部会先判断当前是否正在更新数据(即数据是否为默认),然后将我们要设置的数据保存起来,如果正在更新,则跳过本次任务发送,否则将本次更新任务发送到主线程去执行(不难猜测内部也是handler执行),在具体的...进行自增;在 observe() 时,再将当前持有的 version 赋值给我们的包装类,从而完成了整个套娃流程。...LiveData 用于处理[界面]的数据的状态,即常用于界面的数据状态同步; EventBus 是用于事件总线,即是分发App中所有事件的一个中转站; 前者常用于于处理界面数据状态,并且遵循 Android...相比 LiveData ,Flow 就显得更加强大,不仅独立于具体的视图层,而且其可以单独的集成到业务模块。在功能上,支持数据的各种处理,搭配协程,是 Kotlin 背景下不可获取的利刃。...如果你的项目是 Java 编写,那 LiveData 仍然是你维护页面数据状态的最好搭档。 如果你的项目是 Kotlin 编写,那么 LiveData 依然可以满足你的需求。

    1.4K20

    From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了

    # Kotlin 的类型系统 ## 类、类型和子类型 - 类(class)是指一种数据类型,类定义定义对象的属性和方法,可以用来创建对象实例,例如 `class Person(val name: String...一个类可以用于构造多个类型, 例如泛型类 `List` 可以构造出 `List`、`List` 等不同的类型。...; 可空类型的strNullable:String? 不可以赋值给 非可空类型的 strNotNull:String。 可以看出每一个Kotlin**类**都可以用于构造至少两种**类型**。...子类型反映了类型(即面向对象中的接口)之间的_关系_;而继承反映了一类对象可以从另一类对象创造出来,是_语言特性 _的实现。因此,子类型也称**接口继承**;继承称作**实现继承**。...由于 Nothing 的构造函数是私有的,我们将无法调用 show 函数,除非我们抛出异常,但这没有意义。 这个概念在泛型星投影的时候是有应用的,具体后面会解释。

    46950

    Kotlin快速上手

    快速介绍Kotlin的用法。有些地方会和Java进行类比。 变量声明 Kotlin 使用两个不同的关键字(即 val 和 var)来声明变量。 val 用于值从不更改的变量。...Kotlin 的条件语句彰显了它的一项更强大的功能,即智能类型转换。...要调用 stringMapper(),您可以传递一个 String 和一个满足其他输入参数的函数(即,将 String 当作输入并输出 Int 的函数),如以下示例所示: stringMapper("...类函数和封装 类使用函数对行为建模。函数可以修改状态,从而帮助您只公开希望公开的数据。这种访问控制机制属于一个更大的面向对象的概念(称为“封装”)。...这意味着,您可以直接从 Kotlin 利用现有的 Java 库。此外,绝大多数 Android API 都是用 Java 编写的,您可以直接从 Kotlin 调用它们。

    1.2K10
    领券