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的区别是,它返回的是最后一行

猜你喜欢

转载自blog.csdn.net/u011486491/article/details/80710508