Kotlin 开发者眼中的 Java 缺少哪些特性?
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 则要求每种类型都可以为空或不可为空。
val nonNullable: String = computeNonNullableString() val nullable: String? = computeNullableString()
扩展函数 (Extension Function)
对于以下这段 Java 代码:
class StringUtils { private StringUtils() {} static String capitalize(String string) { return string.substring(0, 1).toUpperCase() + string.substring(1); } } String string = randomString(); String capitalizedString = StringUtils.capitalize(string);
可使用 Kotlin 的扩展函数特性重写为:
fun String.capitalize2(): String { return substring(0, 1).uppercase() + substring(1); } val string = randomString() val capitalizedString = string.capitalize2()
Kotlin 提供了使用新功能扩展类或接口的能力,而无需从类继承或使用 Decorator 等设计模式。开发者可以通过名为 extensions 的特殊声明来实现它。
例如,开发者可以为无法修改的第三方库中的类或接口编写新函数。这些函数可以以常见的方式进行调用,就好像它们是原始类的方法一样。这种机制称为扩展函数。
具体化的泛型 (Reified Generics)
举个例子,如何从值的容器中获取类型化的值。下面是 Spring 的示例:
org/springframework/beans/factory/BeanFactory.java
public interface BeanFactory { <T> T getBean(Class<T> requiredType); }
开发者添加了一个Class<T>
参数,以便能够知道方法体中的类型。但如果 Java 已经具体化了泛型,那就可以这样写:
public interface BeanFactory { <T> T getBean(); }
如果 Kotlin 已经具体化了泛型:
interface BeanFactory { fun <T> getBean(): T }
并调用函数:
val factory = getBeanFactory() val anyBean = getBean<Any>()
Nicolas Fränkel 表示,Kotlin 已成为他在 JVM 上的首选编程语言,至于 Java,只有在必要的时候才会使用。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
平衡 Cookie 取舍,Firefox 默认为所有用户启用 Total Cookie Protection
众所周知,隐私保护是 Firefox 的主要卖点之一,Mozilla 甚至将这个特点放在了 Firefox 官网最显眼的位置(如下图),强调不会为广告商留后门,也不会出卖用户隐私数据。 为了进一步强化 Firefox 浏览器的隐私与安全,Mozilla 于今天宣布为所有桌面用户推出默认启用的 "Total Cookie Protection" 功能。 作为 Firefox 浏览器最强大的隐私功能之一,"Total Cookie Protection" 是在 Firefox 86 版本中首次引入的(非默认设置),随后在 Firefox 89 版本中被扩展到隐私浏览模式(隐私模式默认启用),并在 Firefox 91 中进一步改进,以防止数据泄露。 此前只有在你打开 Firefox 的隐私浏览模式时,才会默认启用 Total Cookie Protection。但是从今天起,所有桌面平台(Linux、macOS 和 Windows)上的 Firefox 浏览器都会默认启用这项功能,无需切换任何东西,也不会影响正常的网络浏览体验。 "Total Cookie Protection" 可以将 ...
- 下一篇
本月月底,Debian 9 生命周期结束
2022 年 6 月 30 日,Debian 9 “Stretch” 将达到生命周期结束(EOL)。建议用户尽快升级到 Debian 10 “Buster” 和 Debian 11 “Bullseye”,其中前者于 2019 年 7 月发布,支持到 2024 年 6 月;后者于 2021 年 8 月发布,支持到 2026 年 6 月。 Debian 长期支持(LTS)是一个将所有 Debian 稳定版的支持周期延长到(至少)5 年的项目。Debian LTS 不是由 Debian 安全团队负责的,而是由一个独立的志愿者小组和对此感兴趣的公司负责的。因此,一旦 Debian 安全团队停止支持,Debian LTS 团队就会接管各个版本的安全维护工作。 在此日期之后,将不会有任何针对 Debian 9 的安全更新发布,服务器也不会因为任何新发现的漏洞而得到修补。 2022 年 6 月 30 日之后,仍继续使用旧的 Debian 9 "Stretch" 系统会使你面临以下风险: 系统相关的安全漏洞 软件不兼容 合规问题 (PCI) 性能和可靠性问题 使你的网络在整体上更容易受到攻击
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS关闭SELinux安全模块