Skip to content
This repository has been archived by the owner on Apr 13, 2023. It is now read-only.

Latest commit

 

History

History
150 lines (113 loc) · 7.95 KB

Kotlin M5 is Out!.md

File metadata and controls

150 lines (113 loc) · 7.95 KB
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 中,一切都是可以空的,例如,考虑一个 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 功能称为非法,那么它会提早爆发,尽可能地责怪有罪。

Varargs 和函数文字

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!