Kotlin 基本介绍(一)
导读大纲
- 1.1.1 Kotlin 是安全的
- 1.1.2 Kotlin 具有互操作性
- 1.1.3 什么是 idiomatic Kotlin?
1.1.1 Kotlin 是安全的
-
一般来说,当我们说一种编程语言是安全的
- 我们指的是它的设计可以防止程序中出现某些类型的错误
- 当然,这并不是绝对的;没有一种语言能防止所有可能出现的错误
-
此外,防止错误通常是有代价的
- 你需要向编译器提供更多关于程序预期运行的信息
- 这样编译器才能验证这些信息是否与程序的运行相符
- 因此,您需要在所获得的安全级别
- 和为添加更详细注释而损失的生产率之间做出权衡
- 你需要向编译器提供更多关于程序预期运行的信息
-
在 JVM 上运行已经提供许多安全保障
- 例如,内存安全、防止缓冲区溢出
- 以及其他因不正确使用动态分配的内存而导致的问题
- 作为 JVM 上的静态类型语言,Kotlin 还能确保应用程序的类型安全
- 此外,Kotlin 还能更进一步:它能轻松定义只读变量(通过 val 关键字)
- 并快速将它们归类到不可变(data)类中
- 从而为多线程应用程序提供额外的安全性
- 例如,内存安全、防止缓冲区溢出
-
除此之外,Kotlin还会在编译时进行检查,以防止运行时出现错误
- 最重要的是,Kotlin 致力于消除程序中的 NullPointerException
- Kotlin 的类型系统会可以跟踪为空和不能为空的值
- 并禁止在运行时导致 NullPointerException 异常的操作
- 为此所需的额外成本极低
- 将一个类型标记为可空只需一个字符,即结尾的问号
- 作为补充,Kotlin 提供许多方便的方法来处理空数据
- 这大大有助于避免应用程序崩溃
fun main() {var s: String? = null // 可以为空var s2: String = "" // 不能为空println(s.length) // 不会编译, 免于崩溃println(s2.length) // 将按预期运行
}
- Kotlin 还能帮助避免另一种异常,那就是**“类转换异常”**
- 当你在未检查对象类型是否正确的情况下
- 就将其转换到某个类型时就会发生这种异常
- Kotlin 将检查和转换合并为单个操作(智能转换)
- 这意味着一旦你检查类型,就可以引用该类型的成员
- 而无需任何额外的转换、重新声明或检查
- 这意味着一旦你检查类型,就可以引用该类型的成员
- <1> 在本例中,编译器对值变量进行类型检查,该变量可能是 Any 类型
- 编译器知道,在条件的真分支中,value 必定是 String 类型
- 因此它可以安全地允许使用该类型的方法(即所谓的smart-cast)
- 当然你可以手动执行转换(value as String)
- 可以但是没必要,并不符合idiomatic Kotlin
- 编译器知道,在条件的真分支中,value 必定是 String 类型
- 当你在未检查对象类型是否正确的情况下
fun modify(value: Any) { // <1>if (value is String) { // <1>// val value = value as Stringprintln(value.uppercase()) // <1>}
}
1.1.2 Kotlin 具有互操作性
-
关于互操作性,首先关心的可能是:"我能使用现有的库吗?
- 对于Kotlin, 答案是 “是的,绝对可以”
- 无论库需要哪种 API,您都可以在 Kotlin 中使用它们
- 您可以调用 Java 方法、扩展 Java 类和实现接口
- 将 Java 注解应用到 Kotlin 类等等
-
与其他一些 JVM 语言不同, Kotlin 在互操作性方面更进一步
- 使得从 Java 调用 Kotlin 代码也毫不费力,无需任何技巧
- Kotlin 类和方法可以像普通 Java 类和方法一样被调用
- 这样,您就可以在项目的任何地方灵活地混合使用Java和Kotlin代码
- 当您开始在 Java 项目中采用 Kotlin 时
- 您可以在代码库中的任何一个类上运行Java到 Kotlin 的转换器
- 而代码的其余部分将继续编译和运行, 无需做任何修改
-
Kotlin 注重互操作性的另一个方面是尽可能多地使用现有的 Java 库
- 例如,Kotlin 的集合几乎完全依赖于 Java 标准库类
- 并为它们扩展额外的功能,以便在 Kotlin 中更方便地使用
- 这意味着当你从 Kotlin 调用 Java API 时
- 永远不需要包装或转换对象,反之亦然
- Kotlin 提供的所有丰富 API 在运行时无需任何成本
- 例如,Kotlin 的集合几乎完全依赖于 Java 标准库类
-
Kotlin 工具还为跨语言项目提供全面支持
- 它可以编译任意混合的 Java 和 Kotlin 源文件
- 无论它们如何相互依赖
- IDEA和Android Studio中的IDE功能也能跨语言工作,允许执行以下操作
- 在 Java 和 Kotlin 源文件之间自由导航
- 调试混合语言项目,并在不同语言编写的代码之间进行切换
- 重构Java方法,并正确更新它们在Kotlin代码中的使用,反之亦然
- 它可以编译任意混合的 Java 和 Kotlin 源文件
1.1.3 什么是 idiomatic Kotlin?
-
在讨论 Kotlin 代码时,有一个短语经常出现: idiomatic Kotlin
-
简单地说,idiomatic Kotlin就是母语为 Kotlin 的用户如何编写代码
- 并在适当的地方使用语言特性和语法糖
- 这样的代码由惯用语组成—可识别的结构(模式)
- 以"Kotlin 方式"解决您试图解决的问题
-
惯用化代码符合社区普遍接受的编程风格,并遵循语言设计者的建议
- 与其他技能一样,学习编写惯用的 Kotlin 代码需要时间和实践
- 在阅读代码示例并编写自己的代码的过程中
- 将逐渐对惯用的 Kotlin 代码的外观和感觉形成直觉
- 并获得在自己的代码中独立应用这些知识的能力
相关文章:
Kotlin 基本介绍(一)
导读大纲 1.1.1 Kotlin 是安全的1.1.2 Kotlin 具有互操作性1.1.3 什么是 idiomatic Kotlin? 1.1.1 Kotlin 是安全的 一般来说,当我们说一种编程语言是安全的 我们指的是它的设计可以防止程序中出现某些类型的错误当然,这并不是绝对的;没有一种语言能防止所有可能出现…...
Cocos Creator发布Moloco平台试玩广告(PlayableAd)
官方文档 主要遇到了两点问题。 1.HTML文件内的body需要注入 <script>window.FBPlayableOnCTAClick () > {(typeof FbPlayableAd undefined) ? alert(FBPlayableAd.onCTAClick) : FbPlayableAd.onCTAClick()}</script> 2.跳转商店使用 window.parent.postM…...
七种修复错误:由于找不到msvcr110.dll 无法继续执行的方法
当你在运行某些程序时遇到“找不到msvcr110.dll”的错误提示,这通常意味着你的系统缺少了Microsoft Visual C 2012 Redistributable包中的一个重要文件。这个DLL文件是Microsoft Visual C Redistributable的一部分,用于支持许多使用Visual C编写的软件和…...
Python模拟鼠标轨迹[Python]
一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型,如直线或曲线路径。然而,这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现,能够通过深度学习技术,学习并模拟更自然的鼠标移动行为。 二.鼠标轨迹算法实…...
Ubuntu搭建java开发环境
一:Ubuntu安装 1、下载Ubuntu 24.04.1 LTS 官网下载地址:https://releases.ubuntu.com/24.04.1/ubuntu-24.04.1-desktop-amd64.iso 可以直接点击这里下载 2、使用VMware安装 新建虚拟机 之后一直下一步,到如下界面,选择 刚刚…...
新能源汽车知识点集萃
功能安全-->ISO26262/GB∕T 34590 2021 信息安全--->ISO21434 预期功能安全--->ISO21448 建模规范-->MAAB/JMAAB/MISAR C Codeing Standard; 开发流程--CMMI/IATF16949//ASPICE(Automotive SPICE)/产品规划/概念开发/设计开发/试制试验与…...
c++234继承
#include<iostream> using namespace std;//public 修饰的成员便俩个和方法都能使用 //protected:类的内部 在继承的子类中可使用 class Parents { public:int a;//名字 protected:int b;//密码 private:int c;//情人public:void printT(){cout << &quo…...
Axios 封装网络请求
1 简介 通过Axios的请求拦截器和响应拦截器实现登录拦截,参数封装。 注意:前提是你的vue已经安装了Axios。 附安装代码: npm install axios 2 封装代码 2.1 utils文件夹下创建 request.js // 网络请求方法 import axios from axios impor…...
LeetCode 面试经典150题 190.颠倒二进制位
复习知识:正数的原码、反码、补码相同,负数的反码在其原码的基础上, 符号位不变,其余各个位取反,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后1 (即在反码的基础上1)。 题目:颠倒给定的 32 位无符号…...
vulhub搭建漏洞环境docker-compose up -d命令执行报错以及解决方法汇总
在利用vulhub靶场搭建环境进行漏洞复现时,我们通常要使用这一步命令: docker-compose up -d 但是经常报错,今天我们来说几个常见的报错以及解决方法: 1.报错提示: ERROR: Couldnt connect to Docker daemon at httpdoc…...
C++ 简介
目录 面向对象程序设计 标准库 ANSI 标准 学习 C C 的使用 标准化 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言,它综合了高级语言和低级语言的特点…...
shardingjdbc分库分表原理
一 Mysql的瓶颈 二 解决方案 三 hash环算法 四 雪花算法...
C++泛型编程:模版
引言 泛型编程(Generic Programming)是一种编程范式,允许编写与类型无关的代码,从而使程序更加灵活和可重用。在C中,泛型编程主要通过模板(Templates)来实现。模板使得我们可以编写通用…...
一道涉及 Go 中的并发安全和数据竞态(Race Condition)控制的难题
这是一道涉及 Go 中的并发安全和数据竞态(Race Condition)控制的难题。 问题描述: 你需要实现一个并发安全的计数器 SafeCounter,该计数器允许多个 Goroutine 同时对其进行读写操作。计数器会存储每个键的计数值。 具体要求&am…...
如何降低H5商城系统的开发成本
前言 H5商城系统通过多种策略来降低开发成本。以下是对这些策略的详细介绍: 一、选择合适的开发平台 原生开发与跨平台开发:原生开发使用HTML5、CSS3和JavaScript等Web技术,虽然性能更佳、用户体验更好,但开发成本相对较高。而…...
为什么越来越多的网工运维转行网络安全?_idc运维转网络安全工程师_系统运维转行网安
最近越来越多的网工运维小伙伴都在吐槽:干网工、运维多年,薪资还是5.6K,技术也遇瓶颈上不去,考虑转岗或者转行。其中大部分的网工运维小伙伴们纷纷瞄准了高薪高前景的网络安全工程师岗位 网络安全是怎样的岗位? 网络安…...
【TabBar嵌套Navigation案例-产品推荐页面-UICollectionView-结合xib使用 Objective-C语言】
一、接下来,我们来说这个产品推荐页面 1.首先呢,它是一个CollectionViewController,当我点击这个产品推荐的时候, 这个Cell的时候,我要跳到一个CollectionViewController, 所以呢,我们需要先找到产品推荐,然后给它去添加一个targetVC,然后给它push到一个产品推荐的页面…...
java.nio.ByteBuffer的 capacity, limit, position, mark
java.nio.ByteBuffer的 capacity, limit, position, mark Capacity(容量) 定义:缓冲区的总容量,即缓冲区中可以容纳的元素的数量。这个容量在缓冲区创建时被设定,并且之后不能被改变。 用途:它定义了缓冲区…...
握手传输 状态机序列检测(记忆科技笔试题)_2024年9月2日
发送模块循环发送0-7,在每个数据传输完成后,间隔5个clk,发送下一个 插入寄存器打拍处理,可以在不同的时钟周期内对信号进行同步,从而减少亚稳态的风险。 记忆科技笔试题:检测出11011在下一个时钟周期输出…...
电商跨境电商商城系统/网上商城接口/电商数据接口详情
电商API接口背景:电商运营中,数据分析这项工作越来越重要,许多品牌方也越来越热衷去做电商数据分析。不过,全面的数据该如何获取呢,此时,电商数据接口的重要性便凸显出来了。 电商API数据接口主要有以下特…...
图灵奖得主杨立昆公开“手撕”Meta 内部环境:“LLM 吸光了房间里的空气”,物理世界才是 AGI 的终局
来源:AI 科技大本营(ID:rgznai100)编译:王启隆Sora 死后,生成式视频路线已到头。2026 年 3 月,在新德里的 AI Alliance Global Leadership Reception 上,Christopher Nguyen 邀请到杨…...
RHCE练习
练习: 1. 在4月份的周一到周三的上午11点执行 0 11 * 4 1-3 2. 每天早上7点到上午11点且每2小时执行一次 0 7-11/2 * * *3. 每天6点执行 0 6 * * * 4. 每周六凌晨4点执行 0 4 * * 65. 每周六凌晨4点05执行 5 4 * * 66. 每天8:40执行 40 8 * * *7. 在每天…...
Linux内核死锁检测与Lockdep工具详解
1. Linux内核死锁问题概述在Linux内核开发中,死锁是一个令人头疼的问题。想象一下这样的场景:两个进程就像两个固执的人,各自握着对方想要的东西,却都不愿意先放手,结果就是双方都卡在那里动弹不得。这就是死锁的典型表…...
SenseVoicecpp ggml-vulkan.cpp大模型[AI人工智能(七十八)]—东方仙盟
ggml-vulkan.cpp核心代码ggml-vulkan 里负责【矩阵乘法 量化模型推理 GPU 调度】的核心代码。1. 核心功能支持所有量化类型:Q4_K、Q5_K、Q8_0、IQ2/3/4、F16、F32 等自动选择最优计算管线:根据数据类型选 FP16/FP32 精度管理 GPU 内存:显存…...
Linux端口占用排查:工具与实战技巧
1. 网络端口占用排查的必要性遇到"Address already in use"错误提示时,每个Linux系统管理员都会心头一紧。这种端口冲突问题不仅影响服务启动,还可能导致关键业务中断。我刚入行时就曾因为Nginx和Apache争抢80端口,导致公司官网瘫痪…...
【2026年最新600套毕设项目分享】springboot实验室预约系统(14320)
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...
PX4飞控解锁失败?别慌!手把手教你用QGroundControl地面站排查15种常见黄灯警报
PX4飞控解锁失败?别慌!手把手教你用QGroundControl地面站排查15种常见黄灯警报 当你满怀期待地准备让无人机起飞,却发现PX4飞控持续闪烁黄灯拒绝解锁时,那种挫败感我深有体会。作为从菜鸟阶段一路摸爬滚打过来的飞手,我…...
学术效率倍增:Zotero插件全生命周期管理的创新实践
学术效率倍增:Zotero插件全生命周期管理的创新实践 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 一、…...
【ASTM D4169】之穿梭机器人,仓储机器人,托盘四向穿梭机器人的包装运输安全验证守法
穿梭机器人(通常指托盘四向穿梭车、智能物流机器人)的包装验证,核心目标是确保其在经历长途运输、仓储周转、装卸搬运后,机械结构、电子元器件和功能性能保持完好。 穿梭机器人的包装验证体系相对复杂,因为它既是运输…...
热传导方程在工程仿真中就像老朋友的聚会——大家总得找个方式坐下来聊聊温度怎么传。今天咱们用MATLAB折腾几个一维和二维的导热算例,顺便聊聊不同计算格式的脾气
【MATLAB各种计算格式的一维/二维导热算例】 1. 一维下的全显格式,全隐格式,半隐格式的导热算例 2.二维下的全显格式,全隐格式,隐式格式ADI迭代,隐式格式点迭代,隐式格式高斯-赛德点迭代(GS&…...
