title | date | author | tags | keywords | categories | reward | reward_title | reward_wechat | reward_alipay | source_url | translator | translator_url |
---|---|---|---|---|---|---|---|---|---|---|---|---|
[译]Kotlin M5 is Out! |
2013-02-04 06:30:00 -0800 |
Andrey Breslav |
官方动态 |
false |
Have a nice Kotlin! |
从现在开始的两个星期内,Kotlin 将是一个开源项目的一年。在这个时候,这是一个很大的努力,在社区的巨大帮助下:我们收到了 164 拉请求 ,这意味着每隔一天的贡献。今天我们进一步推出了一个 Kotlin M5**。本博客文章涵盖了此版本中引入的更改。
M5 是一个短暂的里程碑(你应该从这个术语中减去新年的休息时间),但是我们已经摆脱了 144 个问题 在跟踪器中。 许多 IDE 子系统得到了改进,包括 JUnit 转轮,从 Java 搜索 Kotlin 类,为无效的外部注释提供更好的诊断功能,支持新的图标 达库拉配色方案 :
{% raw %}
{% endraw %}语言的微小变化包括对 Float 文字的更好的支持(现在你可以简单地说 说 1.0,预计浮动 )和将定位和命名参数混合到函数调用的能力。 一些变化不是那么谦虚,可能需要你修复现有的代码...
在旧版本的 Kotlin 中,每个包含顶级函数或声明的属性的包都被编译为一个名为“namespace”的类,其中顶级声明由静态方法表示。当您在 Java 中使用了多个这些“命名空间”类时,您遇到了名称冲突:您不能将两个具有相同名称的类导入同一个编译单元。搭配 Kotlin M5 包 课程以相应的软件包命名 ,这给了他们不同的名字,并解决了这个问题。 命名约定如下:package“org.example”获取一个类“org.example.ExamplePackage”。即,我们采用简单的包名称,将其大小写,附加“Package”,并将该类放入包中。到目前为止,它的效果很好。 注意:由于此更改,您旧版本的kotlin-runtime.jar将无法再工作。编译器将抱怨“不兼容的 ABI 版本”,IDE 将提出用新的运行时 jar 替换旧的运行时 jar。
内部类*是一个非静态嵌套类,即它包含对外部实例的引用。在 Java 中,嵌套类默认是内部的,如果不想对外部引用,那么可以使你的类static。有时它会导致内存泄漏,当有人持有对内部类的实例的引用,而不知道它也包含一个外部实例。 自 M5 以来,Kotlin 想要你 明确标记内部类 ,默认情况下嵌套类为“static”。这可能会破坏您现有的代码,在 IDE 中有一个方便的快速解决方案(只需按下 Alt + Enter 即可)。
{% raw %}
{% endraw %}泛型是棘手的,它们与可空类型的组合更复杂。在 Java 中,一切都是可以空的,例如,考虑一个 Java 方法 foo(ArrayList ),Kotlin(在 M5 之前)用于将它看作是 ArrayList <String?>,即集合可以是 null,其元素可能是也是。这是我们可以做的最安全的事情,但是它被证明是非常不方便的:如果你在 Kotlin 中有一个 ArrayList ,你不能传递给 foo():ArrayList 在它的通用参数中是不变的,因此 ArrayList < String>不是 ArrayList <String?>的子类型。即使使用 KAnnotator,也会造成很大的痛苦。 所以我们决定更改通用参数类型*的默认策略,并加载 ArrayList ?在上述情况下。 此更改可能会破坏现有的一些代码。大部分可以通过删除不需要的问号直接固定。如果你想要旧的类型,你可以 添加一个外部注释 到你的 Java 定义。 但安全呢?现在 Java 代码可能会给你一个空值的集合而不是字符串,而你的 Kotlin 代码将会失败。这可能会发生,但是我们使它失败:Kotlin 检查从 Java 接收到的数据,并提前失败,并出现如下详细的错误消息:
{% raw %}
{% endraw %}Exception in thread "main" java.lang.IllegalStateException:
Method specified as non-null returned null: JavaClass.foo
at _DefaultPackage.main(hello.kt:4)
{% raw %}
{% endraw %}这可能比 NPE 好多了,也许。对功能参数进行同样的检查:如果有人将非法通过空值的 Kotlin 功能称为非法,那么它会提早爆发,尽可能地责怪有罪。
Kotlin 的 类型安全的建设者 是 真棒 ,特别是如果你注意到它们不是一个内置机制,而只是一个很好的语言特征(主要是扩展函数和高阶函数)的组合。有一件事是在旧版本的 Kotlin 中打扰构建器的作者:你不能定义一个可以将函数文字作为括号括起来的参数的 vararg 函数。现在你可以做到:
{% raw %}
{% endraw %}fun css(vararg selectors: Selector, body: Element.() -> Unit) {...}
{% raw %}
{% endraw %}可以叫做
{% raw %}
{% endraw %}css(TD, _class("data")) {
background_color = RED
}
{% raw %}
{% endraw %}您也可以使用命名和定位的参数(包括 varargs):
{% raw %}
{% endraw %}css(TD, body = foo)
{% raw %}
{% endraw %}Kotlin 的标准图书馆也在发展,这次我们修改了范围。要提醒您,范围在循环和条件中使用很多:
{% raw %}
{% endraw %}for (i in 1..10) { /* 1, 2, 3, ..., 10 */ }
if (x in low..high) { /* low <= x <= high */ }
{% raw %}
{% endraw %}新范围在内部更一致,适用于下降迭代,平常增量等情况。我们将在本周的另一篇博客文章中提供更多的细节。
Kotlin 每个类只允许一个构造函数。在建模数据时,我们经常为构造函数参数使用默认值(毕竟,这只能使一个构造函数实用):
{% raw %}
{% endraw %}class Bean(val data: Integer = 0)
{% raw %}
{% endraw %}现在,构造函数更加方便:在生成的字节代码中,此类将获得默认构造函数*,即不使用参数(使用默认值)的构造函数。这种情况在使用 Java 框架(如 JAXB)时出现了很多,所以现在 Kotlin 更加 Java 友好。
你可以从下载 Kotlin M5 插件库 。这个需要 IntelliJ IDEA 12 (推荐使用最近发布的 12.0.3)。 有一个很好的 Kolin!