小程序开发|小程序制作|小程序开发网

搜索

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

2022-6-19 16:00| 发布者: 梅西| 查看: 166| 评论: 0

摘要: 出品 | OSC开源社区(ID:oschina2013) Nicolas Fränkel 是一名资深程序员,拥有近二十年的 Java 开发经历。他在几年前开始学习 Kotlin,在此之后,每当他再使用 Java 时,总会思考为什么自己写的 Java 代码看起来

出品 | OSC开源社区(ID:oschina2013)

Nicolas Fränkel 是一名资深程序员,拥有近二十年的 Java 开发经历。他在几年前开始学习 Kotlin,在此之后,每当他再使用 Java 时,总会思考为什么自己写的 Java 代码看起来不如 Kotlin 那么优雅,并且发现 Java 缺少一些可以提升代码可读性、表现力和可维护性的功能。

对此,Nicolas Fränkel 以 “Kotlin 开发者” 身份总结了他认为 Java 缺少的特性:

  • 不可变引用 ( Immutable References )
  • 空安全 ( Null Safety )
  • 扩展函数 ( Extension Function )
  • 具体化的泛型 ( Reified Generics )

不可变引用 (Immutable References )

虽然 Java 允许开发者定义不可变引用,但这不是强制性的。因为默认情况下,引用是可变的。大多数 Java 代码没有利用不可变引用。

Kotlin 不会让开发者选择:每个属性和局部变量都需要定义为 aval或 a var。另外,Kotlin 不支持重新分配方法参数。

空安全 (Null Safety )

在 Java 中,无法知道变量是否为 null 。基于此,Java 8 引入了 Optional 类型。从 Java 8 开始,返回 Optional 意味着基础值可以是 null ; 返回另一种类型则意味着不是。 Optional

显然,有些库专注于特定的 IDE。此外,库之间几乎不兼容。而且可供使用的库太多了,以至于经常有人会询问该使用哪一个。

最后,在 Java 中使用可空性库是可选的。而 Kotlin 则要求每种类型都可以为空或不可为空。

valnonNullable: String = computeNonNullableStringvalnullable: String? = computeNullableString

扩展函数 (Extension Function )

对于以下这段 Java 代码:

classStringUtils {

privateStringUtils {}

staticStringcapitalize( Stringstring) {

returnstring.substring( 0, 1).toUpperCase

+ string.substring( 1);

}

} Stringstring= randomString;

StringcapitalizedString = StringUtils.capitalize( string);

可使用 Kotlin 的扩展函数特性重写为:

funString. capitalize2: String {

returnsubstring( 0, 1).uppercase + substring( 1);

} valstring = randomString valcapitalizedString = string.capitalize2

Kotlin 提供了使用新功能扩展类或接口的能力,而无需从类继承或使用 Decorator 等设计模式。开发者可以通过名为 extensions 的特殊声明来实现它。

例如,开发者可以为无法修改的第三方库中的类或接口编写新函数。这些函数可以以常见的方式进行调用,就好像它们是原始类的方法一样。这种机制称为扩展函数。

具体化的泛型 (Reified Generics )

举个例子,如何从值的容器中获取类型化的值。下面是 Spring 的示例:

org/springframework/beans/factory/BeanFactory.java

publicinterfaceBeanFactory{

T getBean(Class requiredType);

}

开发者添加了一个 Class参数,以便能够知道方法体中的类型。但如果 Java 已经具体化了泛型,那就可以这样写:

publicinterfaceBeanFactory{

T getBean;

}

如果 Kotlin 已经具体化了泛型:

interfaceBeanFactory{ fungetBean: T

}

并调用函数:

valfactory = getBeanFactoryvalanyBean = getBean

Nicolas Fränkel 表示,Kotlin 已成为他在 JVM 上的首选编程语言,至于 Java,只有在必要的时候才会使用。

相关链接: https://blog.frankel.ch/miss-in-java-kotlin-developer/

END

《开源观止》征稿啦

《开源观止》是 OSCHINA 于 2022 年 6 月推出的一本关于开源的精选集,旨在集中化地呈现一些关于 FLOSS 的信息与观点。我们有一个美好的愿景:开源,观止矣,而这需要更多开源人、开发者参与进来共建。因此,OSCHINA 编辑部特向大家征稿,征稿栏目及要求如下:

《众说》:分享开源实务方面的经验或对开源的思考。

《创业小辑》:记录勇立潮头的开源创企,展现它们的奋斗历程、文化氛围。

请在投稿前联系我们哦!

觉得不错,请点个在看


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

鲜花

握手

雷人

路过

鸡蛋

最新评论

返回顶部