AS负责人说不必用Kotlin重写,但OkHttp拿Kotlin重写了一遍,就发了OkHttp 4.0!

虽然 Android Studio 的负责人 Jeffery 已经澄清,只是 Kotlin-First 而不是 Kotlin-Must,并不需要将 App 用 Kotlin 重写一遍。但是 OkHttp 已经开始用 Kotlin 重写的工作,我们来看看这次重写后带来的差异。
一. 序
在今年的 Google I/O 大会上,Google 宣布将以 Kotlin 作为 Android 开发的一级编程语言。而同天,Google 就开源了只支持 Kotlin 的 Jetpack Compose,以借此呼应这一战略。
消息一出,不少 Android 开发就担心以后是不是只能用 Kotlin 开发了。Android Studio 的负责人 Jeffery Van Gogh,立刻发文表示,"Kotlin-First" 只是表示 Kotlin 将比 Java 在 Android 中占据更重要的地位,但是并不需要将现有 Java 开发的 Android App 使用 Kotlin 重写一遍。
Jeffer 也表示,在 Android Studio 的十几万代码中,大约只有 10% 的 Kotlin 代码,也只会用 Kotlin 来编写新功能。
只是 Kotlin-First,而非 Kotlin-Must。
虽说 Google 也不建议我们将现有的 App 用 Kotlin 重写一遍,但是 OkHttp 这个 Android 下最火的网络框架开源库,已经开始着手用 Kotlin 将整个库重写一遍。
接下来我们看看这次升级的细节吧。
二. Kotlin 版的 OkHttp
Kotlin 是由 JetBrains 公司开发,与 Java 100% 互通,并且具备诸多 Java 尚不支持的新特性。就我个人的使用体验来说,Kotlin 还是非常不错的,唯一有问题的可能就是写 Kotlin 太爽了,导致在同项目中编写 Java 代码时,有那么零点几秒的恍惚。
近期 Jesse Wilson 表示,已经使用 Kotlin 语言,把 OkHttp 3.0 全部重写一遍,并将其命名为 OkHttp4。
此次升级主要是受到了 Okio 2 的启发,而 OkHttp 4 的功能和逻辑,与 OkHttp 3.0 完全一致,等于只是用 Kotlin 将之前的 Java 版本,复刻了一遍。
在仅用 Kotlin 将原项目重写一遍,带来了一些数据指标的变化,我们一起来看看。
2.1 代码量的比较
从代码行数,可以看到,Kotlin 的编写代码量在减少。
- Java: 25,775 行
- Kotlin:24,114 行
代码行减少了 7%,但是如果严格利用 Kotlin 的特性,类似 ConnectionSpec 这个类,可以减少 40% 的代码。
2.2 编译时间
Kotlin 的编译时间是增加了。
- Java :2.4 秒
- Kotlin:10.2 秒
可以看到,Kotlin 的编译速度,相较于 Java 是变慢了。这主要是因为 Kotlin 的编译器比通用 Java 编译器要慢的缘故。
2.3 二进制大小
因为编译器的差异,也将导致 Kotlin 编译后的文件,会比 Java 编译后的代码要大。
- Java:415 KiB
- Kotlin:670 KiB
大约大了 60%,这还是挺令人惊讶的。通过反编译可以发现,这些额外的代码,主要来自 JVM 重载、Kotlin 元数据、空检查以及伴生对象的代码。
三. 小结时刻
作为 Android 开发,现在是时候使用 Kotlin 了。在 Android 开发中,Kotlin 将比 Java 获得更重要的地位,更多的在线培训中以及官方 Demo 都会优先使用 Kotlin 做支持,而对 Java 只是 “尽量满足”,并且有一些功能,可能只提供 Kotlin 的支持,例如本次开源的 Jetpack Compose。
从 OkHttp 的重写这个事情上来看,Kotlin 编写的代码,虽然编译速度更慢、编译的二进制文件更大,但是我们开发人员编写的代码将更少。
这些也符合趋势,程序员做的更少,机器做的更多,不过我相信 Google 在后期应该也会针对这些情况做一些优化,以达到满足生产的需求。
reference:
metrics-for-okhttps-kotlin-upgrade
本文对你有帮助吗?留言、转发、收藏是最大的支持,谢谢!
公众号后台回复成长『成长』,将会得到我准备的学习资料,也能回复『加群』,一起学习进步;你还能回复『提问』,向我发起提问。

AS负责人说不必用Kotlin重写,但OkHttp拿Kotlin重写了一遍,就发了OkHttp 4.0!的更多相关文章
- why在重写equals时还必须重写hashcode方法
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...
- 重写Equals为什么要同时重写GetHashCode
.NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...
- 【转】重写Equals为什么要同时重写GetHashCode
.NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...
- java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同
java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同
- 用Kotlin开发Android的Hello Kotlin!!
1 创建新项目 android studio 新建一个项目 只有一个空MainActivity 2 安装kotlin file-seeting-plugins-install jetbrains pl ...
- 使用kotlinc、kotlin、java命令进行kotlin程序运行
使用kotlinc.kotlin.java命令进行kotlin程序运行 学习了:https://www.cnblogs.com/ShaYeBlog/p/7280452.html kotlinc xxx ...
- java -为什么重写equals(),还需要重写hashCode()?
1.先post这两个方法的基本定义: equals()的定义: 浅谈Java中的equals和==(转) hashCode()的定义: java中hashCode()方法的作用 Java中hashCo ...
- 为什么重写equals()方法就必须重写hashCode()方法
hashCode()和equals()保持一致,如果equals方法返回true,那么两个对象的hasCode()返回值必须一样.如果equals方法返回false,hashcode可以不一样,但是这 ...
- 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?
Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...
- 9.scrapy pycharm调试小技巧,请求一次,下次直接调试,不必每次都启动整个爬虫,重新请求一整遍
pycharm调试技巧:调试时,请求一次,下次直接调试,不必每次都启动整个爬虫,重新请求一整遍 [用法]cmd命令运行:scrapy shell 网址 第一步,cmd进行一次请求: scrapy sh ...
随机推荐
- postgres 备份数据库
https://www.postgresql.org/docs/9.1/static/app-pgdump.html bash-4.2$ pg_dump -Fc xianlan_prod > / ...
- 将socket通信实现多进程
我们知道,使用TCP协议需要提前建立连接,这样就只能一对一的传输,但是这样感觉十分单一,如果实现一个服务器能同时和多个客户端同信了? 这里就需要用到多线程. 处理的不同之处就在于:每一个接进来的客户都 ...
- DLL中导出ANSI和UNICODE函数
模仿window中的DLL导出ANSI和UNICODE版本的函数,使用UNICODE宏来控制使用哪个版本: 在函数实际的执行代码UNICODE版本中,在ANSI函数的版本中只做参数的转换,及ANSI字 ...
- sudo -i和sudo -s
sudo -i,加载用户变量,并跳转到目标用户home目录:sudo -s,不加载用户变量,不跳转目录: sudo : 暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码, ...
- visual studio for mac 安装文件
安装步骤参考: http://jingyan.baidu.com/article/00a07f3869b81082d028dca8.html 所需安装文件:[注 我只下载了javajdk, 需要and ...
- openfire插件(1)
插件核心类,这里对PacketInterceptor.Plugin进行继承.如果开发插件就一定要继承Plugin,而继承PacketInterceptor是拦截用户发送的消息包.对消息包进行过滤.拦截 ...
- Ajax动态切换按钮
function changeAjax(str, obj) { var idx = $(obj).parent().parent().index(); if(confirm('确定执行操作么?')) ...
- j2ee项目Java代码性能优化要点(抄书)
亚信联创科技出版的. 1.与log4j有关的性能问题 Logger对象的标准定义方式: private static transient Logger log=Logger.getLogger(cre ...
- hdu-3078 Network(lca+st算法+dfs)
题目链接: Network Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) P ...
- linux 进程学习笔记-进程状态
task_struct的state字段记录的进程的状态,可分为如下几种: #define TASK_RUNNING 0 可运行状态.这是 “进程正在被CPU运行” 和 “进程正在可运行队列中等待被CP ...