NicolasFr?nkel是一位拥有近二十年Java开发经验的资深程序员。他几年前开始学习Kotlin。之后,每当他再次使用Java时,总是会想为什么自己写的Java代码看起来没有Kotlin优雅,发现Java缺少一些可以提高代码可读性、表达性和可维护性的特性。对此,作为“Kotlin开发者”的NicolasFr?nkel总结了他认为Java缺乏的特性:·不可变引用·空安全·扩展函数·具体泛型(ReifiedGenerics)1.不可变引用(ImmutableReferences)虽然Java允许开发者定义不可变引用,这不是强制性的。因为默认情况下引用是可变的,但大多数Java代码并没有利用不可变引用。Kotlin没有给开发人员选择:每个属性和局部变量都需要定义为val或var。此外,Kotlin不支持方法参数的重新分配。2.NullSafety在Java中,没有办法知道一个变量是否为null。基于此,Java8引入了Optional类型。从Java8开始,返回Optional意味着基础值可以为null;返回另一种类型意味着它不能。可选显然,有些库专注于特定的IDE。此外,库之间几乎没有兼容性。而且可用的库太多,以至于人们经常询问使用哪一个。最后,在Java中使用可空性库是可选的。另一方面,Kotlin要求每种类型都可以为空或不可为空。valnonNullable:String=computeNonNullableString()valnullable:String?=computeNullableString()3.扩展函数对于以下Java代码:classStringUtils{privateStringUtils(){}staticStringcapitalize(Stringstring){returnstring.substring(0,1).toUpperCase()+string.substring(1);}}字符串string=randomString();字符串capitalizedString=StringUtils.capitalize(string);可以使用Kotlin的扩展函数特性重写为:funString.capitalize2():String{returnsubstring(0,1).uppercase()+substring(1);}valstring=randomString()valcapitalizedString=string.capitalize2()Kotlin提供了使用新功能扩展类的能力或接口的能力,而无需从类继承或使用像Decorator这样的设计模式。开发人员可以通过称为扩展的特殊声明来做到这一点。例如,开发人员可以为第三方库中的类或接口编写无法修改的新功能。这些函数可以用通常的方式调用,就好像它们是原始类的方法一样。这种机制称为扩展功能。4.ReifiedGenerics例如,如何从值容器中获取类型化的值。这是Spring中的示例:org/springframework/beans/factory/BeanFactory.javapublicinterfaceBeanFactory{
