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

你真的懂 Kotlin 中的 by 关键字吗?3分钟搞懂精髓

引言 在Kotlin中,by 关键字主要用于实现委托模式。委托模式是一种设计模式,它允许一个对象将部分职责委托给另一个对象。...委托模式概述 在委托模式中,有两个主要角色: 委托类(Delegated Class): 持有实际的工作对象,负责将部分职责委托给这个对象。...委托属性(Delegated Property): 在委托类中声明的属性,使用 by 关键字将其委托给其他类。...Example 类中的 customProperty 属性通过 by 关键字委托给了 CustomDelegate 类。 lazy原理 有了上面的基础,再来看lazy的实现就非常简单。...总结 通过 by 关键字,Kotlin 提供了一种优雅而强大的委托模式实现方式。无论是通过接口还是自定义委托类,都能够轻松地实现代码的重用和解耦。

88410

kotlin之委托介绍

image.png 委托 委托模式是软件设计模式中的一项基本技巧。 在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。...委托模式已经被证明是实现继承的一个很好的替代方式,在扩展一个基类并且重写方法时,基类就必须依赖子类的实现,当不断地修改的时候,基类就会失去当初的性质,Kotlin中就将类默认为final,确保不会被修改...Kotlin中实现委托比较方便,Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。...属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理。..., 属性的 get() 方法(以及set() 方法)将被委托给这个对象的 getValue() 和 setValue() 方法。

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

    iOS优化_你可能没注意到的delegate

    前言: 相信很多人都熟悉“委托模式”(delegate pattern),这个模式主要是为了数据与业务逻辑解耦,举个栗子: 我们的软件需要从后台服务器那边获取数据,而由于网络请求,不可能立即返回,而在获取数据的过程中阻塞应用...这时,我们就可以使用委托模式,当然也可以用block,当获取完网络数据后,回调委托对象 流程: 定义一套接口,某个对象接受另一个对象的委托,则需遵从此接口,从而成为其“委托对象”,而”另一个对象“...就像老板饿了,助理接受老板的吩咐,去kfc买牛肉汉堡,助理去到,打电话给老板说,牛肉汉堡没了,给老板买了鸡肉卷。这时,老板相当于”另一个对象“,助理相当于”某个对象“,,是老板的”委托对象“。...对象没有实现委托协议的方法,也不会造成程序奔溃 但是,如果委托协议方法很多,那么很有可能类中会出现大量的respondsToSelector,你想下,这个判断是否响应方法的...//结构体位置 @end 实现缓存功能的的代码,可以写在属性delegate的setter方法,只要delegate有调用,缓存功能的代码就会生效 (void)setDelegate

    54450

    Kotlin委托

    Kotlin中有委托,这个C#中也有,不过对于学Java的童鞋来说,这是什么鬼啊,到底是干什么用的… 在委托模式中,当有两个对象参与处理同一个请求是,接受请求的对象将请求委托给另一个对象来处理。...委托模式已证明是实现继承的一个很好的替代方式。Kotlin中委托分为类委托和委托属性,Kotlin官方库也封装了一些常用的委托。...类委托 类 Derived 可以继承一个接口 Base,并将其所有共有的方法委托给一个指定的对象,也就是说把类 Derived 因继承而需要实现的方法委托给一个对象,从而不需要在该类内显式的实现: interface...Vetoable 他让你决定这个值是否需要保存,用于在真正保存之前的一些条件判断。...: 有多个类或属性重复使用同一段代码。

    1.5K30

    Android经典实战之Kotlin委托模式和by关键字

    在 Kotlin 中,关键字 by 主要用于委托(Delegation)模式。委托是一种设计模式,可以把一个类的某些职责委托给另一个类来处理。...Kotlin 提供了对委托的直接支持,使它在类和属性中使用起来更加简洁和直观。 委托模式简介 在经典的委托模式中,一个类将它的一些行为通过对象组合的方式委托给另一个对象。...Kotlin 通过关键字 by 提供了简单和直接的语法支持,使这种模式更易于实现。 类委托 在 Kotlin 中,可以使用 by 关键字来实现类委托。...属性委托 除了类委托,Kotlin 还支持属性委托。属性委托允许你将属性的 get 和 set 方法委托给另一个对象来处理。...总结 类委托:通过 by 关键字,一个类可以将某些行为委托给另一个类来实现。 属性委托:可以使用标准库中的委托(如 lazy、observable),也可以创建自定义的属性委托。

    17910

    Kotlin 基础 | 委托及其应用

    委托是常见的模式,它和编程语言无关,即把本来自己做的事情委托给另一个对象去做。装饰者模式和代理模式都通过委托复用了行为。...() } } 这里的关键词by出现在属性名后面,表示属性委托,即将属性的读和写委托给另一个对象,被委托的对象必须满足一定的条件: 对于 val 修饰的只读变量进行属性委托时,被委托的对象必须实现getValue...类会被存储到一个支持属性delegate中,委托属性的设置和取值方法的实现全权委托给代理类。...属性名将自动作用于 map 的键。 总结 Kotlin 委托分为类委托和属性委托。它们都通过关键词by来进行委托。 类委托可以用简洁的语法将类的实现委托给另一个对象,以减少模板代码。...属性委托可以将对属性的访问委托给另一个对象,以减少模板代码并隐藏访问细节。 属性委托有三种实现方式,分别是扩展方法、实现ReadWriteProperty接口、重载运算符。

    98930

    JavaScript 原型的深入指南

    Object.create 让我们再次使用 Object.create 改进我们的例子。 简单地说,Object.create 允许你创建一个对象,该对象将在失败的查找中委托给另一个对象。...换句话说,Object.create 允许你创建一个对象,只要该对象上的属性查找失败,它就可以查询另一个对象以查看该另一个对象是否具有该属性。...然后我们所要做的就是不使用Object.create 委托给animalMethods,我们可以用它来委托Animal.prototype。 我们将这种模式称为 原型实例化。...只要有一个特定于类本身的方法,但不需要在该类的实例之间共享,就可以将其定义为类的静态属性。...假设我们正在与其他开发人员合作,我们是否有办法确保始终使用new关键字调用我们的Animal构造函数? 事实证明,可以通过使用我们之前学到的instanceof运算符来实现的。

    1.1K20

    RefactoringGuru 代码异味和重构技巧总结

    中间人 如果一个类只执行一个操作,将工作委托给另一个类,那么它为什么存在呢? 其他异味 不完善的库类 库迟早会停止满足用户需求。由于库是只读的,所以问题的唯一解决方案,也就是更改库,通常是不可能的。...然后客户端调用对象 B 的方法。 解决方案:在类 A 中创建一个新方法,将调用委托给对象 B。现在客户端不知道也不依赖于类 B。 移除中间人 问题:一个类有太多的方法,这些方法只是委托给其他对象。...将查询与修改分开 问题:是否有一个方法可以返回一个值,但也可以更改对象内部的某些内容? 解决方案:将该方法分为两种不同的方法。正如你所料,其中一个应该返回值,另一个则修改对象。...用委托替换继承 问题:有一个子类只使用其超类的一部分方法(或者不可能继承超类数据)。 解决方案:创建一个字段并在其中放置一个超类对象,将方法委托给超类对象,并摆脱继承。...用继承替换委托 问题:一个类包含许多简单的方法,这些方法将委托给另一个类的所有方法。 解决方案:使该类继承另一个类,这样就不需要委托方法。

    1.9K40

    Prototype (原型)

    Foo(); # 检查 “类” 关系 a instanceof Foo; // true instanceof 回答的问题是:在 a 的整条 [[Prototype]] 链中是否有指向 Foo.prototype...如果你想判断两个对象 (比如 a 和 b )之间是否通过 [[Prototype]] 链关联,只用 instanceof 无法实现。...# 面向委托的设计 [[Prototype]] 代表的是一种不同于类的设计模式。试着把思路从类和继承的设计模式转换到委托行为的设计模式。...但是我们并不需要把这些行为放在一起,通过类的复制,我们可以把它们分别放在各自独立的对象中,需要时可以允许 XYZ 对象委托给 Task 。...委托行为 意味着某些对象(XYZ)在找不到属性或者方法引用时会把这个请求委托给另一个对象(Task)。

    36820

    【Android进阶】kotlin 委托

    委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。...Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。...属性委托 属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理。..., 属性的 get() 方法(以及set() 方法)将被委托给这个对象的 getValue() 和 setValue() 方法。...例如,对于属性 prop,生成隐藏属性 prop$delegate,而访问器的代码只是简单地委托给这个附加属性: 提供委托 通过定义 provideDelegate 操作符,可以扩展创建属性实现所委托对象的逻辑

    53920

    Kotlin Vocabulary | Kotlin 委托代理

    有时候,完成一些工作的方法是将它们委托给别人。这里不是在建议您将自己的工作委托给朋友去做,而是在说将一个对象的工作委托给另一个对象。 当然,委托在软件行业不是什么新鲜名词。...Kotlin 不仅支持类和属性的代理,其自身还包含了一些内建代理,从而使得实现委托变得更加容易。...如果只需要覆盖 remove() 函数来保持对已删除项目的引用,并将 MutableList 的其余空实现委托给其他对象,那该有多好啊。...为了实现这一目标,Kotlin 提供了一种将大部分工作委托给一个内部 ArrayList 实例并且可以自定义其行为的方式,并为此引入了一个新的关键字: by。 让我们看看类代理的工作原理。...在装饰者模式中,装饰者类与被装饰类使用同一接口。装饰者会持有一个目标类的内部引用,并且包装 (或者装饰) 接口提供的所有公共方法。 在您无法继承特定类型时,委托模式就显得十分有用。

    2K20

    Java 程序员应在2019年学习的10条面向对象(OOP)设计原则

    ,该接口的缺点是在任何类都可以使用它之前先实现所有方法,因此意味着尽可能实现具有单一功能的方法。...10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaWxhbmcwMA==,size_16,color_FFFFFF,t_70] 10.授权原则 不要自己做所有事情,而是将其委托给相应的类...委托设计原理的经典示例是Java的中的equals()方法和hashCode()方法方法。为了比较两个对象是否相等,我们要求类本身进行比较,而不是由Client类进行比较。...此委托原则是该原理的另一个示例,其中将事件委托给处理程序进行处理。...找出我们是否违反了任何设计原则并损害了代码的灵活性,但是由于这个世界上没有什么是完美的,所以不要总是尝试用设计模式和设计原理来解决问题,它们主要用于大型企业项目,因为更长的维护周期。

    54530

    Kotlin Vocabulary | Kotlin 委托代理

    有时候,完成一些工作的方法是将它们委托给别人。这里不是在建议您将自己的工作委托给朋友去做,而是在说将一个对象的工作委托给另一个对象。 当然,委托在软件行业不是什么新鲜名词。...Kotlin 不仅支持类和属性的代理,其自身还包含了一些内建代理,从而使得实现委托变得更加容易。...如果只需要覆盖 remove() 函数来保持对已删除项目的引用,并将 MutableList 的其余空实现委托给其他对象,那该有多好啊。...为了实现这一目标,Kotlin 提供了一种将大部分工作委托给一个内部 ArrayList 实例并且可以自定义其行为的方式,并为此引入了一个新的关键字: by。 让我们看看类代理的工作原理。...在装饰者模式中,装饰者类与被装饰类使用同一接口。装饰者会持有一个目标类的内部引用,并且包装 (或者装饰) 接口提供的所有公共方法。 在您无法继承特定类型时,委托模式就显得十分有用。

    18830

    Java开发中存在这样的代码,反而影响整体整洁和可读性

    比如,你也许会看到一个类的大部分有用工作都委托给了其他类,类本身成了一个空壳,除了委托之外不做任何事情。...何时忽略 如果是以下情况,不要删除已创建的中间人: 添加中间人是为了避免类之间依赖关系。 一些设计模式有目的地创建中间人(例如代理模式和装饰器模式)。...重构方法说明 搬移函数(Move Method) 问题 你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。 ?...你也可以看看是否能运用 将双向关联改为单向关联(Change Bidirectional Association to Unidirectional) 让其中一个类对另一个说分手。...,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。

    50430

    Python学习笔记整理(十六) 类的设计

    如何使用类来对有用的对象进行建模? 一、Python和OOP Python和OOP实现可以概括为三个概念。...封装指的是在Python中打包,也就是把实现的细节隐藏在对象接口之后。这并不代表有强制的私有性。封装可以让对象接口的现实 出现变动时,不影响这个对象的用户。...Python中,“组合”(聚合)就是指内嵌对象集合体。 组合类一般都提供自己的接口,并通过内嵌的对象来实现接口。 现在,我们有了员工,把他们放到披萨店。...在Python中,委托通常是以__getattr__钩子方法实现的,因为这个方法会拦截对不存在属性的读取,包装类(代理类)可以使用__getattr__把任意读取转发给包装的对象。...:即时是已经有超类的类,这里就是多重继承方便之处:把Lister加到类首行的超类列表中(将其混合进来) 就可以获得其__repe,同时依然继承现有的超类。

    72410

    第18次文章:JVM中的类加载机制

    二、类加载器的代理模式: 类加载器的代理模式是指:在加载指定的类的时候,当前类加载器并不直接加载这个类,而是交给其他类进行加载。下面我们介绍一种代理模式——双亲委托机制。...双亲委托机制: -就是某个特定的类加载器在介绍加载类的请求时,首先将加载任务委托给父类加载器,依次追溯,直到最原始的父类,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时...(3)这种机制就确保了我们无法使用自定义的java核心库中的类,保护了java核心库的安全性。 (4)代理模式有很多种,双亲委托机制是代理模式的一种,也并不是所有的类加载器都采用双亲委托机制。...比如说:Tomcat服务器类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。...三、自定义类加载器 自定义类加载器的流程: -继承:java.lang.ClassLoader -首先检查请求的类型是否已经被这个类加载器加载到命名空间中了,如果已经加载,直接返回; -委派类加载请求给父类加载器

    55620

    Python中的一些面试题(3)

    #方法一: #如果是一个列表 listdata = [1,3,4,5] listdata.reverse() #但是这方法有一个缺点就是直接修改了原来的list #可以先copy一个再反转 copylist...list1 = [6,4,5,2] list2 = ['e','b','c','a'] #zip函数接受一切可迭代的参数,并将其打包成元组 pairs = zip(list1,list2) #注意:sort...是一种面向对象的设计模式,假如我想改变某个对象的一写方法的行为的话,可以创建一个类来实现对这个方法的委托,改变这个方法的一些行为。...重写了write实现了对文件对象的写方法的改变, #通过__getattr__来实现了对文件对象的其他属性的委托 如何去调用超类(父类或者叫做基类)的方法?...如果是新式类的话就使用super(类名,self).父类方法 经典类和新式类的区别就在于是否是继承与object元类的 如何在python类中创建静态变量和静态方法?

    31720

    Java代理和动态代理机制分析和应用

    代理模式一般涉及到的角色有4种 主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法; 真实主题:真正实现业务逻辑的类; 代理类:用来代理和封装真实主题; 客户端:使用代理类和主题接口完成一些工作...在代理模式中真实主题角色对于客户端角色来说的透明的,也就是客户端不知道也无需知道真实主题的存在。 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。...总结起来可分为以下几类: 在原方法执行之前和之后做一些操作,可以用代理来实现(比如记录Log,做事务控制等)。 封装真实的主题类,将真实的业务逻辑隐藏,只暴露给调用者公共的主题接口。...另外,如果要按照上述的方法使用代理模式,那么真实角色(委托类)必须是事先已经存在的,并将其作为代理对象的内部属性。...动态代理 在java的动态代理API中,有两个重要的类和接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的

    71260
    领券