当前位置: 首页 > 科技观察

在Kotlin开发者眼中,Java缺少哪些特性?

时间:2023-03-16 16:11:22 科技观察

NicolasFr?nkel是一位资深程序员,拥有近二十年的Java开发经验。他几年前开始学习Kotlin。之后,每当他再次使用Java时,总是会想为什么自己写的Java代码看起来没有Kotlin优雅,发现Java缺少一些可以提高代码可读性和性能的特性。电源和可维护性功能。对此,作为“Kotlin开发者”的NicolasFr?nkel总结了他认为Java缺乏的特性:不可变引用(ImmutableReferences)、空安全(NullSafety)、扩展函数(ExtensionFunction)、特定泛型(ReifiedGenerics)变量引用(ImmutableReferences)虽然Java允许开发者定义不可变引用,但这并不是强制性的。因为默认情况下,引用是可变的。大多数Java代码没有利用不可变引用。Kotlin不给开发者选择:每个属性和局部变量都需要定义为aval或avar。此外,Kotlin不支持方法参数的重新分配。Null安全在Java中,无法知道变量是否为null。基于此,Java8引入了Optional类型。从Java8开始,返回Optional意味着基础值可以为null;返回另一种类型意味着它不能。但是,Optional开发人员仅将其设计为返回一个值。方法参数和返回值的语言语法中没有可用的内容。为了解决这个问题,许多库提供了编译时注解。显然,有些库专注于特定的IDE。此外,库之间几乎没有兼容性。而且可用的库太多,以至于人们经常询问使用哪一个。最后,在Java中使用可空性库是可选的。另一方面,Kotlin要求每种类型都可以为空或不可为空。valnonNullable:String=computeNonNullableString()valnullable:String?=computeNullableString()扩展函数(ExtensionFunction)对于下面的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这样的设计模式。开发人员可以通过称为扩展的特殊声明来做到这一点。例如,开发人员可以为第三方库中的类或接口编写无法修改的新功能。这些函数可以用通常的方式调用,就好像它们是原始类的方法一样。这种机制称为扩展功能。具体化泛型(ReifiedGenerics),例如,如何从值的容器中获取类型化的值。这是Spring中的示例:org/springframework/beans/factory/BeanFactory.javapublicinterfaceBeanFactory{TgetBean(ClassrequiredType);}开发人员添加了一个Class参数,以便能够知道中的方法主体类型。但是如果Java有物化泛型,可以这样写:publicinterfaceBeanFactory{TgetBean();}如果Kotlin有物化泛型:interfaceBeanFactory{fungetBean():T}并调用函数:valfactory=getBeanFactory()valanyBean=getBean()NicolasFr?nkel说Kotlin已成为他在JVM上的首选编程语言,而Java仅在必要时才使用。