: :关键字
- 获取类的
KClass - Kotlin允许通过使用”: :”操作符并添加类名来引用该类的主构造器
- 通过::操作符来引用函数,将其作为参数来传递
class Foo(var name: String = "未知")//test函数的参数是(String)->Foo类型fun test(factory: (String) -> Foo) {val x: Foo = factory("Kotlin")println(x.name)}fun main(args: Array<String>) {//通过::Foo引用Foo类的主构造器test(::Foo)}
inline
inline关键字的使用
用在内联函数上,减少调用次数,将函数体直接嵌入到函数调用的地方
internal
一个定义为 internal 的包成员,对其所在的整个 module 可见。如果它是一个其它领域的成员,它就需要依赖那个领域的可见性了。比如,如果我们写了一个 private 类,那么它的 internal 修饰的函数的可见性就会限制于它所在的这个类的可见性
我们可以访问同一个 module 中的 internal 修饰的类,但是其它 module 是访问不到该 internal 类的,该修饰符可用于对外发布的开源库,将开源库中不希望被外部引用的代码设为 internal 权限,可避免对外部引用库造成混淆
根据 Jetbrains 的定义,一个 module 应该是一个单独的功能性的单位,可以看做是一起编译的 kotlin 文件的集合,它应该是可以被单独编译、运行、测试、debug 的。相当于在 Android Studio 中主工程引用的 module,Eclipse 中在一个 workspace 中的不同的 project
作者:叶志陈 链接:https://juejin.im/post/5def05f45188251222736db8 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
权限关键字
| 修饰符 | 类成员 | 顶层声明 |
|---|---|---|
| public(默认) | 所有地方可见 | 所有地方可见 |
| internal | 模块中可见 | 模块中可见 |
| protected | 子类中可见 | |
| private | 类中可见 | 文件中可见 |
非空断言:!!
非空断言用于把任何值转换为非空类型,如果对 null 值做非空断言,则会抛出异常
by lazy
如果我们需要将一个对象延时初始化,我们首先应该使用的是 by lazy 写法,如下所示:
private val mRed by lazy { ContextCompat.getColor(mContext, R.color.red) }
有时候我们需要根据不同的情况给一个 TextView 设置为不同的颜色,但我们无需在这个界面(可能是 Activity 也可能是 Fragment 或一个 RecyclerView的Adapter)初始化的时候就把所有需要的颜色都初始化给一个成员引用,而是在第一次用到这个颜色的时候再初始化它,这样可以节省界面打开的耗时,也能在一定程度上节约内存(例如在初始化一个更大的对象的时候更为明显)。
lateinit
在另外一些情况下,我们的某个对象的初始化需要一些在声明时无法获取到的参数,这时候 by lazy 无法胜任这样的工作,而 lateinit 在这时就是最优的写法,其中一个很重要的原因就是 lateinit 属性在调用自己的方法或使用自己的成员变量的时候无需进行可空调用。
Contract
Kotlin中的Contract契约是一种向编译器通知函数行为的方法。
我们都知道Kotlin中有个非常nice的功能就是类型智能推导(官方称为smart cast), 不知道小伙伴们在使用Kotlin开发的过程中有没有遇到过这样的场景,会发现有时候智能推导能够正确识别出来,有时候却失败了。
/**
* Returns `true` if this nullable collection is either null or empty.
* @sample samples.collections.Collections.Collections.collectionIsNullOrEmpty
*/
@SinceKotlin("1.3")
@kotlin.internal.InlineOnly
public inline fun <T> Collection<T>?.isNullOrEmpty(): Boolean {
contract {
returns(false) implies (this@isNullOrEmpty != null)
}
return this == null || this.isEmpty()
}
actual
public actual interface KProperty<out R> : KCallable<R> {
reified关键字
- 用在泛型之中
- 和inline关键字一同使用
- 在替换的时候,只能的替换泛型参数
