kotlin: ::符号
介绍
在Kotlin月的第三篇文章中,我将介绍Kotlin附带的一些安全功能。 点击链接查看以前的帖子。
空安全
从我所见,这是Kotlin最受吹捧的功能之一。 就个人而言,它给了我一些痛苦,但是一些内置的属性委托(例如lazy和lateinit是有用的解决方法。
这是Koltin提供的安全性:变量不能包含null除非其类型指定它可以为null。 您可以通过放置?将类型声明为可为空? 在类型名称的末尾。 例如,对于可以容纳null或String的变量,其类型将为String? 。 这是无效安全性的第一步。
下一步是您不能直接从可为空的变量中调用方法或属性。 为了安全地取消引用可为空的对象,必须放置一个? 之前. 。 如果被取消引用的对象为null ,则此运算符返回null ,否则返回方法或属性使用的结果。 例如,如果有一个String? 变量称为str ,我们想知道它是否为空,我们可以使用str?.isEmpty()来调用它。 结果为null , true或false 。 使用next运算符,我们可以使用null表示true 。
下一个运算符,通常称为elvis运算符,因为它看起来像是个扑朔迷离的表情符号,它可以帮助我们将null值转换为默认值。 它的工作原理很像三元运算符(Kotlin实际上没有,因为它的if / else块是一个表达式,而不是一个语句),除了左侧是三元运算符的左键和中间键的组合。 它的计算结果为null或所需的类型。 如果确实解析为null ,则使用右侧的运算符。 那么,我们的String? 上面的示例将变成str?.isEmpty() ?: true ,它返回isEmpty()返回的值,如果str为null则返回true 。 顺便说一下, ?:部分是运算符。
最后一个难题是!! 操作员。 这是告诉编译器两件事中的一种。 “我宁愿得到一个NullPointerException不是必须处理null安全性”或“”我知道该类型表明它可以为null,但是我可以保证它不会为null ; 至少现在还没有。”
现在,由于Java互操作,Kotlin无法保证来自Java代码的类型的可空性。 它走了务实的道路,让开发人员决定(如果需要,可以处理后果)是否可以为null 。 注释也可以用来告诉编译器。 有关更多信息,请查看其有关具有null安全性的Java interop的文档。
智能铸造
智能强制转换是一个很棒的小功能,尽管在大多数情况下并不会经常出现,但对于清理代码确实非常有用。 假设您有这样的代码:
if(someVar instanceof SomeType) {
SomeType anotherVar = (SomeType)someVar;
…
}
这种铸造是一种痛苦。 一旦确定someVar的类型为SomeType ,就不会像使用它一样直接使用它。 不,首先,您必须创建另一个变量(或者,如果您“很幸运”,则可以在单行表达式中不使用新变量的情况下执行此操作,但是随后需要为转换类型添加另一组括号– ((SomeType)someVar)... )并写出演员表。
在Kotlin中,您可以这样编写:
if(someVar is SomeType) {
…
}
首先,类型检查operartor较短为is 。 演员也更干净。 如果我们需要在这种情况下使用它(我们不需要),那它将是var anotherVar = someVar as SomeType 。 它不短,但更干净。
我们不需要someVar的原因是因为编译器知道在块内, someVar肯定是SomeType 。 因此,我们甚至不需要为此使用另一个变量,因为它只是假装someVar的类型是SomeType而不是它声明的类型。
有趣的是,它也适用于可空性。 由于String? 被认为不是与String相同的东西,而是一个超类型,可以从String?进行智能转换String? 到String :
if(someStr != null) {
… as if someStr is no longer a nullable type
}
不过,智能投放功能有一定的局限性。 如果有问题的变量可能随时被另一个线程更改,它将不会这样做。 因此,智能转换只能应用于final变量( val )或局部变量(在函数内创建的变量)。
如果您想了解更多信息,请查阅Kotlin的有关智能转换的文档 。
泛型
直截了当,Kotlin具有比Java更好的泛型。 纳夫说。
我只是在开玩笑。 但是说真的,Kotlin的仿制药更好。 他们甚至可以允许您执行Java无法编译的事情。 我无法举一个例子,但是我发现了一个StackOverflow例子,有人试图将其Kotlin代码转换为Java代码,但是他们不能这样做,因为Java代码不允许以某种方式使用泛型,但幸运的是字节码是可以原谅的,并且允许Kotlin做到。
除此之外,Kotlin还使用声明站点差异作为主要差异,而不是Java的使用站点差异。 它也遵循与C#的方差相同的语法(使用out和in代替_ extends或_ super ),在大多数情况下更容易理解。 由于我不擅长解释这些内容,因此只想向您指出Kotlin的文档 。
内联函数和泛型泛型
Kotlin允许您定义内联函数(以某种方式编译的函数,当在代码中调用该函数时,实际上是将代码从函数内部“复制”到调用的位置),这确实有用(仅建议使用]来创建接受内部调用的lambda和方法引用的函数,因为它们也可以内联,而无需实际创建函数对象。 内联函数的另一个有趣特性是具有泛型泛型 (不带类型擦除的泛型)的能力,因为在其内联状态下,编译器实际上可以知道实际的类型是什么(假设它不是以泛型类型开头的) )。 内联函数实际上可以完成很多工作,因此您应该在Kotlin的文档中进行检查。
奥托罗
这样就结束了我在Kotlin中的安全功能列表。 就像我一样,您现在应该完全爱上Kotlin。 即使您现在不愿意这样做,我仍然有下周的帖子可以影响您,所以期待您的到来。
翻译自: https://www.javacodegeeks.com/2016/03/kotlin-month-post-3-safety.html
kotlin: ::符号



所有评论(0)