沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!
比来 Kotlin 特别风行,并且我也赞成 Kotlin 是一个经由沉思熟虑后被设计出的说话,除了下面提到的缺点之外。我会在本文向你分析一些我在开辟过程中碰到的陷阱,并且教你若何避免他们。
谜一样的 null
- class Foo {
- private val c: String
- init {
- bar()
- c = ""
- }
- private fun bar() {
- println(c.length)
- }
- }
如不雅你测验测验初始化这个类,那么代码就会抛出一个 NullPointerException。因为 bar 办法测验测验在 c 变量初始化之前就拜访它。
尽管这个代码本身就是有问题的,才导致异常抛出。然则更糟糕的是你的编译器不会发明这一点。
Kotlin 可以帮你在绝大年夜部分情况下避免 null,然则你不克不及是以而忘记 null 的存在。不然迟早有一天你会碰上类似的问题。
来自 JDK 的 null
Kotlin 的标准库可以或许很好地处理 null。然则如不雅你应用了 JDK 中的类,你须要本身处理关于 JDK 办法调用可能产生的空指针。
大年夜部分情况下 Kotlin 的标准库就足够了,然则有时你须要应用到 ConcurrentHashMap:
- val map = ConcurrentHashMap<String, String>()
- map["foo"] = "bar"
- val bar: String = map["foo"]!!
你还可能会碰上更多更恐怖的问题。当你应用 JDK 类中的办法的时刻,返回值可能是null,并且没有什么像 Map 拜访一样的语法糖。
推敲如下例子:
- val queue: Queue<String> = LinkedList()
- queue.peek().toInt()
- /**
- * Retrieves, but does not remove, the head of this queue,
- * or returns {@code null} if this queue is empty.
- *
- * @return the head of this queue, or {@code null} if this queue is empty
- */
- E peek();
文档中说 peek 办法会返回一个 E 类型的对象,然则 Kotlin 认为 E 是弗抽空的。在接下来的 Kotlin 版本中可能会解决这个问题,然则如今当你在你的工程中应用类似接口的时刻,必定要留意:
- val queue: Queue<String?> = LinkedList()
- queue.peek()?.toInt()
这对于 Java 妒攀来说是不友爱的,如不雅你想在 Java 中成功调用该办法,你须要定义如下接口:
内部 it
当一个 lambda 表达式只有一个参数的时刻,你可以在你的代码中将其省略,并用 it 代替。
- it:单参数的内部名称。当你表达式只有一个参数的时刻,这是一个很有效的特点,声明的过程可以省略(就像 ->),并且参数名称为 it。
问题是,当你的代码中存在向下面例子一样的嵌套函数的时刻:
- val list = listOf("foo.bar"
推荐阅读
2017 年 Python 使用情况报告,你用 2.x 还是 3.x?
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!纵不雅各大年夜编程说话在 2017 年的成长情况,我们会发明 Python 的成长速度异常快。Semaphore 社区查询拜访了 Python 在>>>详细阅读
本文标题:如何避免Kotlin里的陷阱?
地址:http://www.17bianji.com/lsqh/38070.html
1/2 1