Kotlin 学习笔记,2020-06-18

上期笔记


https://kotlinlang.org/docs/reference/nested-classes.html#nested-and-inner-classes
https://kotlinlang.org/docs/reference/enum-classes.html#enum-classes

这两节基本没啥可说的,都在意料之中。Nested class 和 inner class 其实我觉得可以不用加,毕竟 Kotlin 可以定义只在文件内可见的私有类,只要配合类内可以公开访问的类型别名就好了。Enum class 语法设计得还挺好的,感觉写起来会比较清爽。

另外 Enum class 一节里面,有个之前没介绍的泛型语法:

inline fun > printAllValues() {
    ...
}

不知道这里的 reified 关键字是什么语义,后面再看吧。


https://kotlinlang.org/docs/reference/object-declarations.html#object-expressions-and-declarations

这一节有点意思。从例子上看, object expression 和 Java 的 new Something() { ... } 的语法几乎是完全一致的,但是 object expression 可以在线创建一个匿名类型,并且允许后继代码访问该类型成员这个特性,Java 应该是没有的 —— 这个我有点喜欢:

fun foo() {
    val adHoc = object {
        var x: Int = 0
        var y: Int = 0
    }
    print(adHoc.x + adHoc.y)
}

稍微查了下,这个特性好像也是 C# 先玩起来的。逐渐感觉 Kotlin 就是把 C# 里面那些大家觉得好的特性往 JVM 上搬啊。嗯,可怜的微软,XD

另外一边,object declarations 来处理 singleton 场景我觉得挺不错的,特别是明确保证了它的初始化是线程安全和惰性的。Campanion object 替代 static member 这个脑洞略大,但有意思的是我想了想,好像也没发现什么缺点,相反还有 campanion object 可以实现接口这些隐隐觉得有用的新玩法。总得来说,这边感觉还不错。


https://kotlinlang.org/docs/reference/type-aliases.html#type-aliases

这个没啥说的,单纯一个别名。不能在类内定义,有点可惜,类似 C++ 这样 vector::value_type 的用法就不支持 …… 等一下,Kotlin 是 type erasure 的泛型实现,这东西本来就不可能支持 …………


https://kotlinlang.org/docs/reference/inline-classes.html#inline-classes

这是个有点意思的想法。能看得出来 Kotlin 的设计者在认真的考虑如何解决 JVM 在面对「原生类型」和「类类型」时差别对待的问题。是个有益的尝试,但是我的感觉,是不是干脆用 extension 来解决这个方向的问题更好一点?也就是与其新建一个 wrapper 类型来提供额外的方法,不如考虑一下直接给原生类型添加这些方法?可能得考虑一下具体应用场景才行。


https://kotlinlang.org/docs/reference/delegation.html#delegation

这又是一个我喜欢的语法糖,「我的接口函数的实现全部委托给这个对象啦!」,可以省掉很多废话代码。


https://kotlinlang.org/docs/reference/delegated-properties.html#delegated-properties

这个语法糖看起来也不错,应该一样可以省掉很多废话代码。不过实现上来讲比上面那个 delegation 要复杂,感觉上书写起来可能会需要熟悉熟悉,而且大概率什么地方会有坑。

你可能感兴趣的:(Kotlin 学习笔记,2020-06-18)