前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kotlin开发者眼中的Java缺少哪些特性?

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

作者头像
程序猿DD
发布2022-06-24 18:41:29
4460
发布2022-06-24 18:41:29
举报
文章被收录于专栏:程序猿DD程序猿DD

出品 | 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 则要求每种类型都可以为空或不可为空。

代码语言:javascript
复制
val nonNullable: String = computeNonNullableString()val nullable: String? = computeNullableString()

扩展函数 (Extension Function)

对于以下这段 Java 代码:

代码语言:javascript
复制
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 的扩展函数特性重写为:

代码语言:javascript
复制
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

代码语言:javascript
复制
public interface BeanFactory {
    <T> T getBean(Class<T> requiredType);
}

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

代码语言:javascript
复制
public interface BeanFactory {
    <T> T getBean();
}

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

代码语言:javascript
复制
interface BeanFactory {    fun <T> getBean(): T
}

并调用函数:

代码语言:javascript
复制
val factory = getBeanFactory()val anyBean = getBean<Any>()

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

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

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取

推荐阅读

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

点击领取2022最新10000T学习资料

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档