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 需要注意的一些点相关推荐

  1. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  2. 在kotlin companion object中读取Bean,注入Bean对象

    在kotlin companion object中读取Bean,注入Bean对象 在使用kotlin时,或多或少地会使用到一些公共组件,如 http. mongo. redis相关的组件.   使用组 ...

  3. 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置

    在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...

  4. kotlin中继承父属性使用构造方法

    kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...

  5. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  6. SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

    SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...

  7. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  8. Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库

    示例见:Gitte 公仓设置 在项目中添加maven-publish的插件 plugins {kotlin("jvm") version "1.3.72"kot ...

  9. kotlin Bean加载失败lateinit property has not been initialized

    Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...

  10. kotlin重写构造方法编译报错:Primary constructor call expected

    在kotlin中使用construct关键字定义构造方法,如果类定义时已经有构造方法(类名后带括号),需要添加构造方法时,需要使用以下写法: class User(var name,var age){ ...

最新文章

  1. jquery条件选择多个元素(与、或者)
  2. 数据库中间件MyCat学习总结(1)——MyCat入门简介
  3. C#通过Redis实现分布式锁
  4. Spring MVC 中 HandlerInterceptorAdapter过滤器的使用
  5. oracle 查看函数被哪些触发器引用_oracle如何查看存储过程,存储函数,触发器的具体内容...
  6. 编写jmeter测试用例_Jmeter | 实现接口自动化设计说明
  7. 传统socket的编程实现
  8. 好用的格式化SQL工具SQL Prompt
  9. C#百度OCR-身份证图片识别提取信息
  10. 【HenCoder Plus】第四期终于来了
  11. Nginx区分PC或手机访问不同网站
  12. vscode没有应用程序与此操作的指定文件有关联
  13. 【设置版本号】React Native 通过配置文件package.json设置 Android安卓和iOS版本号
  14. python实现excel追加饼图
  15. 第三方软件测试z5x电池,vivo Z5x第三方续航测试结果公布,刷新手机业续航排行榜...
  16. ffmpeg缩放视频尺寸
  17. 查看锐捷poe交换机供电状态_锐捷 RG-S2910-24GT4SFP-UP-H 24个电口支持PoE和PoE+供电交换机...
  18. 移动端页面一键保存到桌面
  19. 解决matlab2018A中文乱码问题
  20. loadrunner12-错误 -26366: 找不到 web_reg_find 的“Text=19728.00”

热门文章

  1. serializeArray(),serialize(),param()用法
  2. python——百分制成绩转五分制(循环)
  3. 马云穿布鞋演讲,任正非打的出行,盘点科技大佬们令人发指的节俭生活
  4. .NET Core/.NET5/.NET6 开源项目汇总9:客户端跨平台UI框架
  5. 44、Flutter之组件布局原理与约束(constraints)
  6. activiti+5.21+mysql_ydl-workflow基于SAAS服务,完美整合springboot + activiti5 + MyBatis
  7. 相关性及相关性的显著性检验
  8. 网游跨平台愈演愈烈 引擎跨平台开发或为关键
  9. 【BZOJ 2713】[Violet 2]愚蠢的副官【BZOJ1183】[Croatian2008]Umnozak——【数位DP】
  10. 我的游戏学习日志47——游戏交互设计(3)