Kotlin知识体系(二) : Kotlin的七个关键特性

news2025/3/17 5:37:29

前言

在Android开发中,Kotlin以其简洁的语法和强大的特性显著提升了开发效率。本文将解析Kotlin中7个关键特性,通过代码示例展示它们在实际开发中的应用。

一、构造函数:主次分明

主构造函数

class User constructor(_name: String) { // 传统写法
    val name = _name
}

class Student(val id: Int, var name: String) // 简化版

主构造函数直接声明在类名后,使用val/var声明参数可自动创建属性

次构造函数

class Person(val name: String) {
    constructor(name: String, age: Int) : this(name) {
        println("Secondary constructor: $name, $age")
    }
}

次构造函数必须委托主构造函数,适用于需要多种初始化方式的场景

二、数据类:样板代码终结者

data class Book(val id: Int, val title: String, var price: Double)

自动生成功能:
equals()/hashCode()
toString() 格式:Book(id=1, title=Kotlin Guide, price=39.9)
copy() 方法实现对象浅拷贝
• 组件函数componentN()支持解构

大多数情况下,自动生成的equals() / hashCode()都是可靠的。

  • 对于基本类型(Int、String 等):直接比较值。
  • 对于引用类型(其他对象):调用其 equals() 方法。
  • 例外:数组(Array)的比较使用 Arrays.equals(),而非内容深度比较。(一维数组使用Arrays.Equals()能够实现深度比较,但二位数组使用Array.Equals不能实现深度比较)
    需要干预的场景 :

类体中定义额外属性

  • 继承非data class (用组合代替继承)
  • 二位数组内容的深度比较(得用deepEquals())

三、单例对象:object关键字

object NetworkManager {
    private const val TIMEOUT = 5000
    
    fun makeRequest(url: String) {
        println("Requesting $url with timeout $TIMEOUT")
    }
}

// 使用
NetworkManager.makeRequest("https://api.example.com")

替代Java静态方法的最佳实践,初始化时机在首次访问时(线程安全)

四、伴生对象:静态成员的替代方案

class DatabaseClient {
    companion object {
        const val VERSION = "1.2.3"
        
        fun create(): DatabaseClient = DatabaseClient()
    }
}

// 调用
val client = DatabaseClient.create()
println(DatabaseClient.VERSION)

伴生对象成员可通过类名直接访问,支持实现接口和扩展函数

五、继承与接口:明确开放原则

open class Animal(val name: String) {
    open fun makeSound() = "Generic animal sound"
}

class Dog(name: String) : Animal(name) {
    override fun makeSound() = "Woof!"
}

interface Swimmer {
    fun swim() {
        println("Default swimming implementation")
    }
}

关键点:
• 类/方法默认final,需open允许继承
override强制要求显式声明重写
• 接口支持默认方法实现

六、属性访问器:精细化控制

class Temperature {
    var celsius = 0.0
    var fahrenheit
        get() = celsius * 9/5 + 32
        set(value) {
            celsius = (value - 32) * 5/9
        }
}

val temp = Temperature()
temp.fahrenheit = 68.0
println("${temp.celsius}°C") // 输出20.0°C

通过自定义getter/setter实现:
• 数据格式转换
• 输入有效性验证
• 延迟初始化
• 访问日志记录

七、密封类 vs 枚举类

密封类(Sealed Class)

sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
    object Loading : Result<Nothing>()
}

fun handleResult(result: Result<Int>) = when(result) {
    is Result.Success -> println(result.data)
    is Result.Error -> println(result.exception)
    Result.Loading -> println("Loading...")
}

优势对比枚举

  • 可携带数据(每个子类都能有独立属性)
  • 支持继承体系扩展
  • 配合when表达式实现穷尽检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2316426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS源码概述

FreeRTOS源码概述 1 FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中&#xff0c;FreeRTOS 相关的源码如下&#xff1a; 主要涉及2个目录&#xff1a; Core Inc 目录下的 FreeRTOSConfig.h 是配置文件Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Mi…

日志统计(C++,模拟,双指针)

题目要我们求在某个时间段中&#xff0c;帖子点赞数达到K的帖子数 遍历方式一 我们可以先对所有帖子根据时间&#xff0c;升序排序 枚举每一条帖子&#xff0c;枚举后续每一条帖子&#xff0c;如果id相同且时间差小于d&#xff0c;那么就记录起来&#xff0c;如果记录数量cn…

加固脱壳技术:DEX动态加载对抗

1. 加固技术原理剖析 1.1 DEX保护演进路线 加固方案发展历程&#xff1a; graph LR A[2015 代码混淆] --> B[2017 DEX动态加载] B --> C[2019 VMP指令虚拟化] C --> D[2022 全链路加密] 1.1.1 主流加固方案对比 厂商核心防护技术弱点分析梆梆加固DEX文件分片…

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器&#xff0c;这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…

强化学习的一些概念

目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个分支&#xff0c;旨在让智能体&#xff08;Agent&#xff09;通过与环境的交互学习最优策略&#xff0c;以…

MambaTab:表格数据处理的新利器

——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab&#xff0c;一种基于结构化状态空间模型&#xff08;SSM&#xff09;的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构&#xff0c;MambaTab在普通监督学习和特征增量学习场景中均表现优异&…

Kafka的流量控制机制

Kafka的流量控制机制 Kafka 作为一款高吞吐量的消息队列系统&#xff0c;能够在海量数据场景下提供稳定的消息生产和消费能力&#xff0c;其背后的流量控制机制功不可没。我们需要认识到&#xff0c;Kafka 的流量控制并非仅仅是为了防止系统过载或崩溃&#xff0c;它的目标是实…

CSSHTML新特性

HTML5 新特性探秘 在 Web 开发的不断演进中&#xff0c;HTML5 带来了一系列令人振奋的新特性&#xff0c;极大地提升了网页的功能和用户体验。今天&#xff0c;我们就来深入探究一下这些新特性。 语义化标签&#xff1a;让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…

51单片机的工作方式

目录 一、51 单片机的时钟电路及时钟信号 &#xff08;一&#xff09;时钟电路 &#xff08;二&#xff09;时钟信号 二、51 单片机的CPU 时序 &#xff08;一&#xff09;时钟周期​ &#xff08;二&#xff09;机器周期​ &#xff08;三&#xff09;指令周期​ 三、…

Java算法OJ(12)

目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道的练习题&#xff0c;欢迎大家在评论区多多交流&#xff0c;废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目&#xff1a;斐波那契数列_牛客题霸…

MrRobot靶机详细解答

一、主机发现 arp-scan -l二、端口扫描、目录枚举、指纹识别 2.1端口扫描 nmap -p- 192.168.55.147发现22端口关闭&#xff0c;且无其它特殊端口&#xff0c;只能去网页中寻找信息 2.2目录枚举 dirb http://192.168.55.1472.3指纹识别 nmap 192.168.55.147 -sV -sC -O --…

java线性表(单向链表)

对于链表我们有很多种&#xff0c;有带头和不带头&#xff0c;双向和单项&#xff0c;循环和不循环。 我们实现的单向链表是不带头单向不循环链表。 链表不比顺序表&#xff0c;它可以连续也可以不连续&#xff0c;是链子型的每条链子两边都有节点&#xff08;除首尾)。 单向…

QT:动态属性和对象树

动态对象 1.添加Q_PROPERTY对象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…

PH热榜 | 2025-03-16

1. BrowserAgent 标语&#xff1a;基于浏览器的人工智能代理 - 无限使用&#xff0c;固定费用 介绍&#xff1a;在您的浏览器中直接创建和运行AI工作流程&#xff0c;无需支付API费用。我们的可视化编辑器不需要编写代码&#xff0c;同时我们的浏览器本地技术支持以固定价格进…

关于进程的实验(子进程和父进程相关的)

文章目录 1.第一个问题2.第二个问题3.第三个问题 1.第一个问题 编写一段程序&#xff0c;利用系统调用fork( )创建两个进程。当此程序运行时&#xff0c;在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符&#xff1a;父进程显示字符“a”;子进程分别显…

《基于视频监控的智能跌倒检测系统》开题报告

一、本课题研究目标 本课题旨在研究并实现一个基于视频监控的智能跌倒检测系统&#xff0c;以有效识别老年人或需特殊照顾人群的跌倒事件&#xff0c;并实现自动报警功能。具体而言&#xff0c;该系统将通过机器学习和深度学习技术&#xff0c;对视频数据中的行为模式进行分析&…

SonarQube安装及结合IDEA使用详细教程(2025适配版)

一、环境验证与准备 JDK版本确认 PS C:\> java -version openjdk version "17.0.14" 2025-01-21 LTS OpenJDK Runtime Environment Zulu17.5615-CA (build 17.0.147-LTS) OpenJDK 64-Bit Server VM Zulu17.5615-CA (build 17.0.147-LTS)安装路径说明 主程序路径&a…

2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题E卷

目录 总体规划 模块二:设备基础信息配置 模块三:网络搭建与网络冗余备份方案部署 模块四:移动互联网搭建与网优 模块五:出口安全防护与远程接入 总体规划 医院在进行网络部分信息化建设方案设计过程中,需要保证医院、血液中心通过社保网进行互连互通,同时满足献血中心与医…

vue echarts封装使用

echarts 尺寸自动调节 resize.js 柱状图 components/dashboard/lineChart.vue <template><div :class"className" :style"{height:height,width:width}" /> </template><script> import echarts from echarts require(echarts/…

PTP协议赋能高精度时间同步网络

什么是PTP&#xff1f; PTP&#xff08;精确时间协议&#xff0c;Precision Time Protocol&#xff09; 是一种基于IEEE 1588标准的网络时间同步协议&#xff0c;旨在为分布式系统中的设备提供亚微秒级&#xff08;甚至纳秒级&#xff09;的高精度时钟同步。其核心目标是通过消…