• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15),kotlinandroid

Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15),kotlinandroid

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15),kotlinandroid等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15),kotlinandroid


 

作者:Antonio Leiva

时间:Mar 9, 2017

原文链接:https://antonioleiva.com/property-delegation-kotlin/

 

 

如我们在前面文章中读到的,属性需要默认值,不能声明属性,而不给它们赋值。

 

 

由于你要存储视图到属性中,这就产生一个问题了。在对象创建期间,这赋值代码将被执行,而此时你不能访问这个内容。

 

 

那你有能做什么?

 

 

属性委托:委托属性值到另一个对象

 

 

 

属性委托将使用另一个对象,这个对象能够调用get和set(如果使用了var)返回结果。

 

目前,我们还不能控制许多对象的创建,如Android框架,在许多情况下,这委托将挽救我们的生命。

 

我将向你展示三个例子,我认为它们在Android中非常有用。

 

设置视图到属性

 

对于这个例子,我们用委托有两个选项,且禁止用null(如果你能够避免它,有些事情不建议使用)。

 

这是我最喜欢的,因为它迫使你对于不可变的、不太安全的属性使用var。

 

用保留字lateinit,说明属性不能为空,但是我们仍然没有final价值:

1 lateinit var textView:TextView

 

在onCreate,我们能够赋值给final值:

1 setContentView(R.layout.activity_main)
2 textView = findView(R.id.welcomeMessage)
3 toast(textView.text)

 

尽管它与委托notNull做相同的操作、被归入第一喜欢,但这不是真正的委托。

 

第二个选择则更加优雅。它由Lazy委托组成,直至属性第一次被调用,相关代码是不会执行:

1 val textView by lazy { findView(R.id.welcomeMessage) }

 

在textView的get被第一次调用之前,findView是不能运行的。由于你不能错误的修改其值所以它更安全,并且它不会强制我们在setContentView之后记得设置它。

 

此刻,我们做:

 

1 toast(textView.text)

 

 

这行代码将在lazy形式下被执行。

 

如你所见,委托的方式用by保留字表示。

 

我们来看另一个例子。

 

 

通知适配器变更

 

在适配器中,我们有items属性,每次自动启动adapter时更新。

 

1 var items: List by Delegates.observable(emptyList()) {
2     _, _, _ -> notifyDataSetChanged()
3 }

 

它简单地设置初始值,然后在每次更改后调用定义的函数。

 

 

在这种情况下,我只是调用notifyDataSetChanged,但是,如你所见,函数收到的新旧两个值,所以在技术上你可以检查变化是什么,只更新其区别。

 

如果你对这个例子有兴趣,我在另一篇文章更广泛的描述它。

 

声明Lazy方法的Dagger图

 

 

 

 

这是我发现的非常有用的另一个情形。

 

 

返回到lazy,你能够在属性声明期间,用它声明应用的component:

 

1 val component: AppComponent by lazy { 
2     DaggerAppComponent
3             .builder()
4             .appModule(AppModule(this))
5             .build() 
6 }

 

 

这个方法,你不需要用lateinit,属性则为不可变的。

 

如果在Activity中,用subcomponents,你能够做相同的事:

1 class HomeActivity : AppCompatActivity(), HomePresenter.View {
2     val component by lazy { app.component.plus(HomeModule(this)) }
3     ...
4 }

 

新Kotlin 1.1版本:局部委托属性

 

我们已经见到怎样用委托是给我们类属性的额外能力。而例如lazy,对变量也真的有帮助吗?Kotlin是缺乏这一特性的。

 

现在,用局部委托属性,我们做:

 

 1 fun testLocalDelegation() {
 2     val database by lazy { createDatabase() }
 3     val cache by lazy { createMemoryCache() }
 4 
 5     if (mustUseDatabase()) {
 6         database.use { ... }
 7     } else {
 8         cache.use { ... }
 9     }
10 }

 

 

尽管不使用lazy委托,这个例子能够解决,但它还是有助于理解这些概念。

 

我们有几个可能会或不会被使用的“笨重”对象。通过用lazy,我们能够推迟它们的实例化,直到我们确信要使用它们。

 

 

在首次使用时,花括号内的代码被执行,且被缓存起来,以备以后再使用。

 

 

结论

 

 

 

属性委托将帮助你属性更强大,更简化,且代码可重用。

 

 

这里我们仅仅看到Kotlin库的标准属性,而

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Kotlin的属性委托:无上下文情况下Android的赋值(KAD 15),kotlinandroid

相关文章

  • 2017-05-26android历史
  • 2017-05-26Android中dip、dp、sp、pt和px的区别,androiddip
  • 2017-05-26Handler消息传递机制(二)Handler,Loop,Message,MessageQueue的工作原理
  • 2017-05-26安卓--selector简单使用,安卓--selector
  • 2017-05-26关于数据抓取之xpath提取text为空问题的原因和解决方案
  • 2017-05-26仿拉手团购App2--当前城市选择Activity,app2--activity
  • 2017-05-26Andriod中Style/Theme原理以及Activity界面文件选取过程浅析
  • 2017-05-26Android 四大组件之Activity(续2),androidactivity
  • 2017-05-26Android镜像文件ramdisk.img,system.img,userdata.img介绍,ramdisk镜像
  • 2017-05-26硅谷新闻11--极光推送的集成,硅谷新闻11--极光

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 编译器开发系列--Ocelot语言5.表达式的有效性检查,--ocelot有效性
    • Android 用Canvas画textview、bitmap、矩形(裁剪)、椭圆、线、点、弧
    • 硅谷社交15--群详情,硅谷社交15--
    • 计算器Pro应用项目源码,计算器pro源码
    • Android ShareSDK快速实现分享功能,androidsharesdk
    • Android程序中使用iconfont心得,androidiconfont
    • Android开发6:Service的使用(简单音乐播放器的实现),androidservice
    • Android常见问题及开发经验总结(三)
    • android小知识点代码片段
    • 安卓开发—简单的登陆界面,安卓登陆界面

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有