title | date | author | tags | keywords | categories | reward | reward_title | reward_wechat | reward_alipay | source_url | translator | translator_url |
---|---|---|---|---|---|---|---|---|---|---|---|---|
[译]Kotlin 1.0 Beta 3 is Out! |
2015-12-07 07:45:00 -0800 |
Andrey Breslav |
官方动态 |
false |
Have a nice Kotlin! |
我们很高兴发布了 Kotlin 1.0 Beta 的另一个更新。我们正在努力完善标准库,抛弃了过时已久的设计结构,同时修复了 bugs,改进性能和为下一个版本作准备。 完整的更新历史在 这里 。
最新的 issue 在 这里 。
我们努力在 1.0 版本到来之前让标准库变得更加完美。这意味着进行一些尝试,所以会有新的部分被弃用,有新的函数被添加。我们计划在 1.0 版本(或 RC)中对标准库进行一次最后的清理:删除所有已过时和其他遗留的东西。
这里我们只关心一个需要注意的变化:现在contains()
和其他类似的扩展方法接受集合元素的父类型。
// strs: Collection<String>
// ns: String?
// cs: CharSequence
// i: Int
strs.contains(ns) // accepted now
strs.contains(cs) // accepted now
str.contains(i) // ERROR (in fact, a deprecation warning, but will be an error soon)
我们发现以前建议的containsRaw
方法比较低效,使用contains()
更加合适,同时保证了兼容性。请注意,集合接口本身是完整的,所有这些都是通过扩展功能完成的。请使用Code Cleanup来迁移代码。
一些需要注意的语言变化,完整列表在这里 。
许多我们以前不推荐的实现现在会报错。请使用Code Cleanup进行迁移。
这种代码已被证明是有问题的,所以我们决定弃用它:
when {
foo.isValid(), foo.isReady() -> process(foo)
...
}
许多人倾向于认为条件 foo.isValid(), foo.isReady()
表示 foo.isValid() == true and foo.isReady() == true
,而实际上逗号是指 or。解决方法很简单:只需使用 ||:
when {
foo.isValid() || foo.isReady() -> process(foo)
...
}
Code Cleanup会自动迁移。
一个 bug 已被修复,现在我们可以在注解的参数中使用默认值:
annotation class Entry(val value: String)
annotation class Example(
val entries: Array<Entry> = arrayOf(Entry("a"), Entry("b")) // OK now
)
最近我们将传统的 Java 的Enum.values()
更改为一个属性:Enum.values
,但现在我们将回滚这个更改,因为有一个没有注意到的角落:枚举中的常量可能被命名为values
,然后便没有办法访问其中的任何一个。我们考虑了不同的方案,最后决定将values
改回函数是最干净的。
所以,现在不推荐使用values
属性,也不推荐使用 values()
函数。
我们正在清理和修正小问题的可见性和作用域
- companion objects 中允许 protected 成员
- 子类调用非 @JvmStatic 的 protected 对象将被标记为错误(不支持)
- 对于 open 属性,私有 setters 现在已被标记为过时
- local sealed class 已弃用(从不可用)
- 重写的 setter 不能降低可见性
- 枚举类中不再允许存在内部类
- lambdas / object literals / local 函数中禁止使用未初始化的变量
我们合并了 IntelliJ IDEA 的主要 Kotlin 插件和 Android 的Kotlin扩展插件。后者现在已经过时了,因为它的功能可以从 Kotlin 插件获取。
此外,我们还添加了对 Android productFlavors的支持:现在,来自不同 flavors 的属性可以在不同的包中使用。
例如,我们可以在 build.gradle
文件中存在两种 flavors:
productFlavors {
free {
versionName "1.0-free"
}
pro {
versionName "1.0-pro"
}
}
现在,我们不仅可以在main source set中的布局使用合成属性,还可以在 flavor 布局使用合成属性:
// Import synthetic properties for the `activity_free.xml` layout in the `free` flavor
import kotlinx.android.synthetic.free.activity_free.versionMarker
class FreeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
setContentView(R.layout.activity_free)
...
versionMarker.text = "Free version"
}
}
请注意,main source set的所有布局现在位于kotlinx.android.synthetic.main
包之下,旧的包命名约定已被弃用。