• 自动秒收录
  • 软件:1973
  • 资讯:56903|
  • 收录网站:210434|

IT精英团

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

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

浏览次数:
评论次数:
编辑: 温瑜
信息来源: ITPUB
更新日期: 2022-06-23 00:19:45
摘要

出品|OSC开源社区(ID:oschina2013)NicolasFränkel是一名资深程序员,拥有近二十年的Java开发经历。他在几年前开始学习Kotlin,在此之后,每当他再使用

  • 正文开始
  • 相关阅读
  • 推荐作品

| OSC开源社区(ID: oschina2013)

Nicolas Fr nkel是一名高级程序员,拥有近20年的Java开发经验。几年前他开始学习科特林语。之后,每当他再次使用Java时,总会思考为什么自己写的Java代码看起来没有Kotlin那么优雅,发现Java缺少一些可以提高代码可读性、表现力和可维护性的功能。

对此,作为“Kotlin开发者”的Nicolas Fr nkel总结了他认为Java所缺乏的特性:

不可变引用

空安全(空安全)

扩展功能(扩展功能)

的具体化泛型

不可变引用 (Immutable References)

尽管Java允许开发人员定义不可变的引用,但这并不是强制性的。因为默认情况下,引用是可变的。大多数Java代码不使用不可变的引用。

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

空安全 (Null Safety)

在Java中,没有办法知道一个变量是否为空。基于此,Java 8引入了可选类型。从Java 8开始,返回Optional意味着基值可以为null返回另一个类型意味着否。可选

显然,有些库专注于特定的IDE。此外,库之间几乎没有兼容性。而且有这么多可用的库,人们经常会问用哪一个。

最后,在Java中使用可空性库是可选的。Kotlin要求每个类型可以为空或非空。

val nonnullable : String=computeNonN

ullableString()val nullable: String? = computeNullableString()

扩展函数 (Extension Function)

对于以下这段 Java 代码:

class StringUtils {

private StringUtils() {}

static String capitalize(String string) {
return string.substring(, 1).toUpperCase()
+ string.substring(1);
}
}String string = randomString();
String capitalizedString = StringUtils.capitalize(string);

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

fun String.capitalize2(): String {
return substring(, 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,只有在必要的时候才会使用。

相关

老工程师总结的10条经验 太有益了~
« 上一篇 2022-06-23
  • 老工程师总结的10条经验 太有益了~
    0阅读 0条评论 个赞
    正文到现在,我已经做了超过21年开发,可以说,我生命中超过一半的时间都在编程,那既是我的职业,也成了我的习惯。下面是我在开发过程中学到的10条最有价值的经验。1你永远不可能什么都知道尤其是在开……
  • Git指令的本质真的很好理解
    0阅读 0条评论 个赞
    前言作为当前世界上最强大的代码管理工具Git相信大家都很熟悉,但据我所知有很大一批人停留在clone、commit、pull、push...的阶段,是不是对rebase心里没底只敢用merge?碰见版……
  • 如何构建自己的可引导Linux Live CD
    0阅读 0条评论 个赞
    使用第三方工具或官方Linux操作系统,在Linux中创建DIY可启动LiveCD很容易。需要帮忙?按照以下步骤在几分钟内创建LinuxLiveCD。LiveCD(或“liv……
  • 拯救你生命的5个python技巧
    0阅读 0条评论 个赞
    Python是一种强大且易上手的语言,语法简洁优雅,不像Java那么繁琐废话,并且有一些特殊的函数或语法可以让代码变得更加简短精悍。根据笔者经验,下面介绍常用的5个python小技巧:字符串操作列表推……
  • 向我学习Java——Java枚举示例说明
    0阅读 0条评论 个赞
    Java中的枚举(Enum)是一种特殊的数据类型,它包含一组预定义的常量。在处理不需要更改的值时,通常会使用enum,比如一周中的天数、一年中的季节、颜色等等。在本文中,我们将看到如何创建一个枚举e……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • AI面试机器人后端架构实践
    0阅读 0条评论 个赞
    01导读AI面试机器人通过利用灵犀智能语音语义平台的人机语音对话能力模拟招聘者与求职者进行多轮语音沟通,达到在线化面试的效果。本文详细描述了AI面试机器人的后端架构组成、对话引擎设计、资源需求预估策略……
  • 运维入坑必看:Kubernetes平台架构解读
    1阅读 0条评论 个赞
    Kubernetes是一个开源容器编排平台,管理大规模分布式容器化软件应用,是云计算发展演进的一次彻底革命性的突破。Kubernetes是谷歌的第三代容器管理系统,是Borg独特的控制器和Omega灵……
  • 如何通过缓存提高系统性能
    1阅读 0条评论 个赞
    缓存在系统中最消耗性能的地方就是对数据库的访问了,一般来说,增、删、改操作不会出现什么性能问题,除非索引太多,并且数据量有十分庞大的情况下,这三个操作才会导致性能问题。一般可以限制单表索引的数量来提升……
  • 为什么数据库是无服务器最难的堡垒?
    0阅读 0条评论 个赞
    星星之火、可以燎原它是站在海岸遥望海中已经看得见桅杆尖头了的一只航船,它是立于高山之巅远看东方已见光芒四射喷薄欲出的一轮朝日,它是躁动于母腹中的快要成熟了的一个婴儿。——毛泽东一、关于Serverle……
  • 通过Java轻松实现AI人脸识别登录
    1阅读 0条评论 个赞
    想自己搞一个人脸识别玩玩,随着开始查找资料来研究这方面的信息,还好有好几家公司都有提供这方面的免费API,也是省下来很多功夫。一开始采用的是face++,但是在执行到最后一步人脸搜索时出现问题,一直提……
  • Kubernetes抛弃Docker 不要慌!这里有一套实用的方法告诉你~
    1阅读 0条评论 个赞
    导读Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围……
  • 是时候告别Linux 5.17内核系列了
    0阅读 0条评论 个赞
    是时候告别Linux5.17内核系列了,因为它现在在kernel.org网站上被标记为EOL(End-of-Life),这意味着它将不再接收维护更新。LinuxKernel5.17于……
  • 你还不明白分布式会话怎么解决?就看这个吧!
    20阅读 0条评论 个赞
    平常做的项目都是在一台应用系统,并且所有的操作都在一台Tomcat服务器上,并不会引发Session共享的问题,所以并不会对我们的系统产生影响,但是当我们部署多个微服务的时候,再搭配Nginx进行负载……
  • 说实话!卡夫卡的原理原来是这样的 一看就懂!
    0阅读 0条评论 个赞
    Kafka是主流的消息流系统,其中的概念还是比较多的,下面通过图示的方式来梳理一下Kafka的核心概念,以便在我们的头脑中有一个清晰的认识。01基础Kafka是一套流处理系统(也可以叫消息队……
  • 30个重要的Python字符串方法
    0阅读 0条评论 个赞
    以下文章来源于公众号-法纳斯特,作者小F字符串是Python中基本的数据类型,几乎在每个Python程序中都会使用到它。这次给大家介绍30个最重要的内置字符串方法,希望大家能从中找到对自己有帮助的技巧……
  • 用Docke r构建自己的dns服务器
    0阅读 0条评论 个赞
    在开发运维过程中经常需要自定义一个域名来管理服务,通常的方法是修改hosts文件,但还有一种更便捷的方法,从源头上解决问题,也就是使用DNS来实现。1.搭建搭建依然使用docker,安装前请安装好do……
  • 共享SQL优化的最左前缀原则
    0阅读 0条评论 个赞
    索引结构联合索引结构所以可以沿着这两个索引树来进行检索:所以where条件里的内容看是否能走索引则看最左前缀原则是否满足。常见案例最左前缀的使用,有两条说明:1.Mysql从左向右匹配直到遇到范围查……
  • 高考AI专业择校指南:清北自由选择 浙大仿真强 哈工大自然语言也不错
    2阅读 0条评论 个赞
    本文转载自|AI科技评论作者|王玥2022年高考在今天拉开帷幕,想必很多学生想选择发展如火如荼的AI专业,但不知如何择校。出于八卦好奇心,小编扒了多个评价指标,最终找到了一份专门针对人工智能进……
  • Git指令的本质真的很好理解
    0阅读 0条评论 个赞
    前言作为当前世界上最强大的代码管理工具Git相信大家都很熟悉,但据我所知有很大一批人停留在clone、commit、pull、push...的阶段,是不是对rebase心里没底只敢用merge?碰见版……
  • MySQL主从式 6分钟带你掌握!
    0阅读 0条评论 个赞
    以下文章来源于公众号-楼仔,作者楼仔MySQL主从一直是面试常客,里面的知识点虽然基础,但是能回答全的同学不多。比如我之前面试小米,就被问到过主从复制的原理,以及主从延迟的解决方案,你之前面试,有遇……
  • 数据治理组织:不易建立 但太难转向?
    0阅读 0条评论 个赞
    公司在2022年工作会议上提出了“5141”数智驱动的商业智能总体框架(如下图所示),要求围绕顶层设计、组织保障、流程运营、IT支撑、数据安全治理、数据消费六个方面构建企业级数据治理体系,确保数据从产……
  • 在Kotlin开发者眼中 Java缺少哪些特性?
    0阅读 0条评论 个赞
    出品|OSC开源社区(ID:oschina2013)NicolasFränkel是一名资深程序员,拥有近二十年的Java开发经历。他在几年前开始学习Kotlin,在此之后,每当他再使用……
  • 记住关系数据库设计的要领就够了!
    1阅读 0条评论 个赞
    摘要本文讨论关系数据库设计相关的一些内容,涉及关系模型,表结构设计等内容,以学生选修课程讲述设计过程,在尽量讲清楚设计要领的前提下,简化设计内容。本文基于MySQL数据库为基础,适合有一定关系型数据库……
  • 运维!你要对数据心存敬畏~
    0阅读 0条评论 个赞
    简述“对数据要有敬畏之心”这个主题是同事在一个早会分享时提出的,却直接引起我心中的共鸣。前几年各种删库跑路事件、Facebook宕机事件仍不绝于耳,虽然大家将“删库跑路”当作一个调侃与谈资,但上升到“……
  • 写在前端的Docker入门终极指南 不要再说不能用Docker了!
    0阅读 0条评论 个赞
    来源:jartto.wang/2020/07/04/learn-docker/富Web时代,应用变得越来越强大,与此同时也越来越复杂。集群部署、隔离环境、灰度发布以及动态扩容缺一不可,而容器化则成为中……
最近发布资讯
更多