Kotlin简介(5)

但是,数据类不提供默认构造函数。这是对于Hibernate而言是个问题,它使用默认构造函数来创建实体对象。这里,我们可以利用插件,它为JPA实体类生成额外的零参数构造函数。

在JVM语言领域,Kotlin的与众不同之处在于,它不仅关注工程的优雅性,而且解决了现实世界中的问题。

采用Kotlin的实际好处 减少空指针异常

解决Java中的NPE是Kotlin的主要目标之一。将Kotlin引入项目时,显式空检查是最明显的变化。

Kotlin通过引入一些新的操作符解决了空值安全问题。Kotlin的?操作符就提供了空安全调用,例如:

val model: Model? = car?.model

只有当car对象不为空时,才会读取model属性。如果car为空,model计算为空。注意model的类型是Model?——表示结果可以为空。此时,流分析就开始起作用了,我们可以在任何使用model 变量的代码中进行NPE编译时检查。

这也可以用于链式调用:

val year = car?.model?.year

下面是等价的Java代码:

Integer year = null; if (car != null && car.model != null) { year = car.model.year; }

一个大型的代码库会省掉许多这样的null检查。编译时安全自动地完成这些检查可以节省大量的开发时间。

在表达式求值为空的情况下,可以使用Elvis操作符( ?: )提供默认值:

val year = car?.model?.year ?: 1990

在上面的代码片段中,如果year最终为null,则使用值1990。如果左边的表达式为空,则?: 操作符取右边的值。

函数式编程选项

Kotlin以Java 8的功能为基础构建,并提供了一等函数。一等函数可以存储在变量/数据结构中并传递出去。例如,在Java中,我们可以返回函数:

@FunctionalInterface interface CalcStrategy { Double calc(Double principal); } class StrategyFactory { public static CalcStrategy getStrategy(Double taxRate) { return (principal) -> (taxRate / 100) * principal; } }

Kotlin让这个过程变得更加自然,让我们可以清晰地表达意图:

// Function as a type typealias CalcStrategy = (principal: Double) -> Double fun getStrategy(taxRate: Double): CalcStrategy = { principal -> (taxRate / 100) * principal } 当我们深入使用函数时,事情就会发生变化。下面的Kotlin代码片段定义了一个生成另一个函数的函数: val fn1 = { principal: Double -> { taxRate: Double -> (taxRate / 100) * principal } }

我们很容易调用fn1及结果函数:

fn1(1000.0) (2.5)

输出
25.0

虽然以上功能在Java中也可以实现,但并不直接,并且包含样板代码。

提供这些功能是为了鼓励团队尝试FP概念,开发出更符合要求的代码,从而得到更稳定的产品。

注意,Kotlin和Java的lambda语法略有不同。这在早期可能会给开发人员带来烦恼。

Java代码:

( Integer first, Integer second ) -> first * second

等价的Kotlin代码:

{ first: Int, second: Int -> first * second }

随着时间的推移,情况就变得明显了,Kotlin支持的应用场景需要修改后的语法。

减少项目占用空间大小

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/399b3a47af5bc6f9637d2b00264ce737.html