广告
返回顶部
首页 > 资讯 > 移动开发 >Kotlinby关键字作用及使用介绍
  • 143
分享到

Kotlinby关键字作用及使用介绍

2024-04-02 19:04:59 143人浏览 独家记忆
摘要

目录1.Kotlin委托2.类委托3.属性委托3.1定义一个被委托的类3.2标准委托3.3把属性存储在映射中3.4Not Null1.Kotlin委托 在委托模式中,两个对象参与处理

1.Kotlin委托

在委托模式中,两个对象参与处理同一请求,接受请求的对象讲请求委托给另外一个对象来处理。Kotlin直接支持委托模式,更加优雅,简洁。kotlin通过关键字by实现委托。

2.类委托

类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。

以下实例中派生类Derived继承了接口Base所有方法,并且委托一个传入的Base类的对象来执行这些方法。

//创建接口
interface Base {
    fun print()
}
//实现此接口的被委托的类
class BaseImp(val x:Int) : Base {
    override fun print() {
 
        println(x)
    }
}
//通过关键字by建立委托类
class Derived (b:Base):Base by b
class Main {
    compaNIOn object{
        @JVMStatic
        fun main(args: Array<String>) {
            var baseImp=BaseImp(100)
            Derived(baseImp).print()  //输出100
        }
    }
}

在Derived声明中,by子句表示,将b保存在Derived的对象实例内部,而且编译器将会生成继承自Base接口的所有方法,并将调用转发给b。我们看看生成的java代码。

public final class Derived implements Base {
   // $FF: synthetic field
   private final Base $$delegate_0;
   public Derived(@NotNull Base b) {
      Intrinsics.checkNotNullParameter(b, "b");
      super();
      this.$$delegate_0 = b;
   }
   public void print() {
      this.$$delegate_0.print();
   }
}

3.属性委托

属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其委托给一个代理类,从而实现对该类的属性统一管理。

属性委托语法格式:

val/var <属性名>:<类型> by <表达式>

by关键字之后的表达式就是委托,属性的get()方法(以及set()方法)将被委托给这个对象的getValue()和setValue()方法。属性委托不必实现任何接口,但是必须提供getValue()函数(对于var属性,还需要setValue()函数)。

3.1定义一个被委托的类

该类包含getValue()方法和setValue()方法,且参数thisRef为进行委托的类的对象,prop为进行委托的属性的对象。

//定义包含属性委托的类
class Example {
    var p:String by Delegate()
}
//委托的类
open class Delegate {
    operator fun getValue(thisRef:Any?,property:KProperty<*>):String{
        return "$thisRef,这里委托了${property.name} 属性"
    }
    operator fun setValue(thisRef: Any?,property: KProperty<*>,value:String){
        println("$thisRef 的 ${property.name} 属性赋值为 $value")
    }
}
class Main {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            var e=Example()
            println(e.p) //访问该属性 调用getValue函数
            e.p="rururn" //调用setValue()函数
            println(e.p)
        }
    }
}

输出结构为:

com.geespace.lib.kotlin.by2.Example@3f99bd52,这里委托了p 属性
com.geespace.lib.kotlin.by2.Example@3f99bd52 的 p 属性赋值为 rururn
com.geespace.lib.kotlin.by2.Example@3f99bd52,这里委托了p 属性

3.2标准委托

Kotlin的标准库已经内置了很多工厂方法来实现属性的委托。

延迟属性Lazy

lazy()是一个函数,接受一个Lambda表达式作为参数,返回一个Lazy<T>实例的函数,返回的实例可以作为延迟属性的委托:第一次调用get()会执行已传递给lazy()的lamda表达式并记录结果,后续调用get()只是返回记录的结果。

class LazyTest {
    companion object{
        val lazyValue:String by lazy {
            println("computed!") //第一次调用输出,第二次调用不执行
            "Hello"
        }
        @JvmStatic
        fun main(args: Array<String>) {
            println(lazyValue)
            println(lazyValue)
        }
    }
}

执行输出结果:

computed!
Hello
Hello

3.3把属性存储在映射中

一个常见的用例是在一个映射(map)里存储属性的值。这经常出现在像解析JSON或者其他"动态"事情的应用中。这种情况下,你可以使用映射实例自身作为委托来实现委托属性。

class Site(val map:Map<String,Any?>) {
    val name:String by map
    val url:String by map
}
class TestMain {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            val site=Site(mapOf(
                "name" to "maozh",
                "url"  to "www.baidu.com"
            ))
            //读取映射值
            println(site.name)
            println(site.url)
        }
    }
}

执行输出结果:

maozh
www.baidu.com

3.4Not Null

notNull适用于那些无法在初始化阶段就确定属性值的场合。

class Foo{
     var notNullBar:String by Delegates.notNull<String>()
}
foo.notNullBar="bar"
println(foo.notNullBar)

需要注意,如果属性在赋值前就被访问的话则会抛出异常。

到此这篇关于Kotlin by关键字作用及使用介绍的文章就介绍到这了,更多相关Kotlin by关键字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Kotlinby关键字作用及使用介绍

本文链接: https://www.lsjlt.com/news/169050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Kotlinby关键字作用及使用介绍
    目录1.Kotlin委托2.类委托3.属性委托3.1定义一个被委托的类3.2标准委托3.3把属性存储在映射中3.4Not Null1.Kotlin委托 在委托模式中,两个对象参与处理...
    99+
    2022-11-13
  • Java中super关键字介绍以及super()的使用
    目录1、super的使用:2、先复习一下this关键字的使用。3、super关键字:总结:1、super的使用: (1)super是一个关键字。 (2)super和this很类似,我...
    99+
    2022-11-13
  • Kotlin中Object关键字的使用示例介绍
    目录1.定义单例类2.对象表达式3.伴生对象在kotlin中的超类是Any,并没有使用Java中的Object关键字表示超类。 在Kotlin中Object关键字,另有作用。 1.定...
    99+
    2022-11-13
  • java中this关键字的详细使用介绍
    this 的使用:修饰属性和方法,也可以理解为当前对象 this 调用构造器: 1.我们在类的构造器里,可以使用,调用本类中指定的其他构造器 2.构造器中不能通过”thi...
    99+
    2022-11-12
  • C++中引用和const关键字介绍
    目录引用常引用const关键字用法1)定义常量2)定义常量指针3)定义常引用总结引用 下面的写法定义了一个引用,并将其初始化为引用某个变量。类型名 & 引用名 = 某变量名;...
    99+
    2022-11-13
  • C#中的var关键字用法介绍
    从.NET 3.0开始,在方法内部可以使用var关键字声明局部变量。var关键字到底是什么?在何种情况下使用呢? var关键字用来隐式地声明一个数据类型,变量类型是在编译期确定的,而...
    99+
    2022-11-13
  • Java中static关键字的介绍和用法
    本篇内容主要讲解“Java中static关键字的介绍和用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中static关键字的介绍和用法”吧!用类名去调用static有两层含义: 可以理...
    99+
    2023-06-02
  • Java中的Final关键字的用法介绍
    这篇文章主要介绍“Java中的Final关键字的用法介绍”,在日常操作中,相信很多人在Java中的Final关键字的用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的Final关键字的用法介绍...
    99+
    2023-06-16
  • Java SocketAPI关键代码怎么写以及使用介绍
    Java SocketAPI关键代码怎么写以及使用介绍,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java SocketAPI如何才能够正常的使用呢?这个问题就需要我们掌...
    99+
    2023-06-17
  • C#中const,readonly和static关键字的用法介绍
    如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字static,这又意味着什么呢? const co...
    99+
    2022-11-13
  • Java static关键字详细介绍与用法总结
    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。下面整理内容大家可以参考下。1.     静态方法 通常...
    99+
    2023-05-31
    java static ava
  • C语言简明介绍常见关键字的用法
    目录1、关键字2、常见关键字1、关键字 关键字是C语言提供的,不能自己创建关键字; 关键字不能用作变量名,eg:int char;这样的写法是不可取的。 2、常见关键字 auto b...
    99+
    2022-11-13
  • C++中的volatile关键字及其作用
    volatile是C语言的一个关键字,该关键字的作用是保持内存的可见性 例子: 我们对2号信号进行了捕捉,当该进程收到2号信号时会将全局变量flag由0置1, 也就是说,在进程收到2...
    99+
    2023-05-16
    C++ volatile关键字 C++ volatile关键字的作用
  • C#泛型详解及关键字作用
    这篇文章主要来讲讲c#中的泛型,因为泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用。 一、什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (C...
    99+
    2022-11-12
  • Apache介绍及使用
    Apache的介绍 Apache全称:Apache HTTPD Server ;是Apache基金会的一个开源网页服务器,可以在大多数计算机操作系统中运行。Apache提供的服务器又称为:补丁服务器 ...
    99+
    2023-09-17
    apache php 服务器
  • fastjson2 介绍及使用
    目录 前言一、导入fastjson2依赖二、json对象与json数组的创建json对象创建json数组创建 三、json对象取值与json数组遍历取值json对象取值json数组遍历取值 四、json对象与字符串的转换js...
    99+
    2023-08-18
    java fastjson2 fastjson fastJson
  • 详细介绍Java关键字throw throws Throwable的用法与区别
    目录1. Throwable1.1 扩展-Error1.2 扩展-Exception2. throws2.1 扩展3. throw3.1 扩展4. 总结throw,意为“...
    99+
    2022-11-13
  • Python中有哪些关键字及关键字的用法
    目录Python有哪些关键字1.and , or2.del3.from4.golbal5.with6.while, for…in…7.assert8.pa...
    99+
    2023-02-04
    python关键字用法 python关键字
  • KVM 介绍及作用详解
    目录一、虚拟化1、背景2、虚拟化技术介绍3、虚拟化技术发展4、虚拟化类型5、虚拟化的特性特性:二、KVM概述1、KVM简介2、KVM的作用3、KVM 虚拟化架构/三种模式4、KVM核...
    99+
    2022-11-13
  • Python中关于字典的常规操作范例以及介绍
    目录1.字典的介绍2.访问字典的值(一)根据键访问值(二)通过get()方法访问值3.修改字典的值4.添加字典的元素(键值对)5.删除字典的元素6.字典常见操作1.len 测量字典中...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作