Kotlin 需要注意的一些点
Kotlin 需要注意的一些点
kotlin file/class
在创建kotlin的时候,我们创建的是Kotlin file/class,这个文件我们可以不添加类,也可以天加多了类,完全看需求创建
object对象:
参考:http://ohmerhe.com/2015/12/19/class-object-object/
object修饰的是对象表达式,用来定义一个对象而非一个类!而class定义的则是一个类。
对象表达式的特点:
1、 可以很方便地访问作用域中的其他变量,而不必将该变量设为final:
2、 它定义出来就相当于一个对象,所以这个对象并不能通过外部类的实例访问到该对象,而只能通过类名来访问,同样该对象也不能直接访问到外部类的方法和变量。
3、被companion修饰时,则将对象和外部类关联在一起,这样,我们就能直接通过外部类访问到对象内部的元素。
我们甚至可以省略掉该对象的对象名,然后使用Companion替代需要声明的对象名:
这里一个类里面只能声明一个内部关联对象。
Data修饰class
想要创建那种什么都不做只持有数据的Bean类,需要使用“data class”修饰数据类对象,类似于java语言中的Bean对象。
但是,在class之前的data帮你做好所有的工作,主要做的工作有:
1、自动实现equals() /hashCode() 方法2、自动实现toString() 格式是“Person(name=John, age=42,height=1.8)”,3、按声明顺序对应的所有属性,4、copy() 函数。
代理:
kotlin标准库中提供kotlin.properties.Delegates用于支持默认代理类型.
懒加载:使用Delegates.lazy()
观察者:使用Delegates.observable()
非空属性:使用Delegates.notNull()
存储属性到map中:使用Delegates.mapVal(map:Map<String,Any?>)或Delegates.mapVar(map:Map<String,Any?>)
Delegates.notNull()的使用:
参考:http://johnnyshieh.me/posts/kotlin-property-lazy-init-not-null/
有的成员属性不能在构造函数中初始化,会在稍后某的地方完成初始化,可以确定是非空,但是因为不能在构造时初始化只能定义为可能为空的类型(T?),然后在后面调用时都要加上!!操作符。
通过代理委托:
这样的话如果赋值前使用时会抛出一个错误。
代理的目的是委托需要延迟初始化的非空属性。这和lateinit的效果很像。
只是lateinit不能修饰原生类型(Int、Float、Char等),而委托属性可以使用于原生类型和局部变量中。
mapTo
将现有数据转化为其他数据然后加入到目的集合中
通常给的是这个解释是
inline fun <T, R, C :MutableCollection<in R>> Array<out T>.mapTo(destination: C,transform: (T) -> R): C {d for (item in this) destination.add(transform(item)) return destination }
实际我用到的是:
(0 until mTitles.size).mapTo(mTabEntities){ TabEntity(mTitles[it], mIconSelectIds[it], mIconUnSelectIds[it]) }
until
until可以单独使用:
(0 until mTitles.size).mapTo(it*2)
也可以和for循环结合使用
for( I in 0 unti 5)
until和’..’的区别:(如上的式子)
until :0,1,2,3,4
‘..’ :0,1,2,3,4,5
属性下的set和get
改变访问的可见性或者是对其进行注解,但是又不想改变它的默认实现,那么你就可以定义set和get但不进行实现。
var mRootView: T? = null private set
let ”VS” apply ”VS” with “VS” run
参考:https://www.jianshu.com/p/28ce69d58fea
let:默认当前这个对象作为闭包的it参数,然后返回最后一行,或者指定return
apply:在函数范围内,可以任意调用该对象的任意方法,然后返回该对象
with:是一个单独函数,它返回的是最后一行,同时可以直接调用对象的方法。像是let和apply的结合。
run:run和apply的区别是,它返回的是最后一行
Kotlin 需要注意的一些点相关推荐
- springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据
SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...
- 在kotlin companion object中读取Bean,注入Bean对象
在kotlin companion object中读取Bean,注入Bean对象 在使用kotlin时,或多或少地会使用到一些公共组件,如 http. mongo. redis相关的组件. 使用组 ...
- 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置
在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...
- kotlin中继承父属性使用构造方法
kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
- SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos
SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...
- OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3
OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...
- Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库
示例见:Gitte 公仓设置 在项目中添加maven-publish的插件 plugins {kotlin("jvm") version "1.3.72"kot ...
- kotlin Bean加载失败lateinit property has not been initialized
Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...
- kotlin重写构造方法编译报错:Primary constructor call expected
在kotlin中使用construct关键字定义构造方法,如果类定义时已经有构造方法(类名后带括号),需要添加构造方法时,需要使用以下写法: class User(var name,var age){ ...
最新文章
- jquery条件选择多个元素(与、或者)
- 数据库中间件MyCat学习总结(1)——MyCat入门简介
- C#通过Redis实现分布式锁
- Spring MVC 中 HandlerInterceptorAdapter过滤器的使用
- oracle 查看函数被哪些触发器引用_oracle如何查看存储过程,存储函数,触发器的具体内容...
- 编写jmeter测试用例_Jmeter | 实现接口自动化设计说明
- 传统socket的编程实现
- 好用的格式化SQL工具SQL Prompt
- C#百度OCR-身份证图片识别提取信息
- 【HenCoder Plus】第四期终于来了
- Nginx区分PC或手机访问不同网站
- vscode没有应用程序与此操作的指定文件有关联
- 【设置版本号】React Native 通过配置文件package.json设置 Android安卓和iOS版本号
- python实现excel追加饼图
- 第三方软件测试z5x电池,vivo Z5x第三方续航测试结果公布,刷新手机业续航排行榜...
- ffmpeg缩放视频尺寸
- 查看锐捷poe交换机供电状态_锐捷 RG-S2910-24GT4SFP-UP-H 24个电口支持PoE和PoE+供电交换机...
- 移动端页面一键保存到桌面
- 解决matlab2018A中文乱码问题
- loadrunner12-错误 -26366: 找不到 web_reg_find 的“Text=19728.00”
热门文章
- serializeArray(),serialize(),param()用法
- python——百分制成绩转五分制(循环)
- 马云穿布鞋演讲,任正非打的出行,盘点科技大佬们令人发指的节俭生活
- .NET Core/.NET5/.NET6 开源项目汇总9:客户端跨平台UI框架
- 44、Flutter之组件布局原理与约束(constraints)
- activiti+5.21+mysql_ydl-workflow基于SAAS服务,完美整合springboot + activiti5 + MyBatis
- 相关性及相关性的显著性检验
- 网游跨平台愈演愈烈 引擎跨平台开发或为关键
- 【BZOJ 2713】[Violet 2]愚蠢的副官【BZOJ1183】[Croatian2008]Umnozak——【数位DP】
- 我的游戏学习日志47——游戏交互设计(3)