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

打印 上一主题 下一主题

主题 974|帖子 974|积分 2922

前言

在Android开辟中,Kotlin以其简便的语法和强大的特性显著提拔了开辟服从。本文将解析Kotlin中7个关键特性,通过代码示例展示它们在实际开辟中的应用。
一、构造函数:主次分明

主构造函数

  1. class User constructor(_name: String) { // 传统写法
  2.     val name = _name
  3. }
  4. class Student(val id: Int, var name: String) // 简化版
复制代码
主构造函数直接声明在类名后,使用val/var声明参数可自动创建属性
次构造函数

  1. class Person(val name: String) {
  2.     constructor(name: String, age: Int) : this(name) {
  3.         println("Secondary constructor: $name, $age")
  4.     }
  5. }
复制代码
次构造函数必须委托主构造函数,适用于需要多种初始化方式的场景
二、数据类:样板代码闭幕者

  1. 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关键字

  1. object NetworkManager {
  2.     private const val TIMEOUT = 5000
  3.    
  4.     fun makeRequest(url: String) {
  5.         println("Requesting $url with timeout $TIMEOUT")
  6.     }
  7. }
  8. // 使用
  9. NetworkManager.makeRequest("https://api.example.com")
复制代码
替代Java静态方法的最佳实践,初始化机遇在初次访问时(线程安全)
四、伴生对象:静态成员的替代方案

  1. class DatabaseClient {
  2.     companion object {
  3.         const val VERSION = "1.2.3"
  4.         
  5.         fun create(): DatabaseClient = DatabaseClient()
  6.     }
  7. }
  8. // 调用
  9. val client = DatabaseClient.create()
  10. println(DatabaseClient.VERSION)
复制代码
伴生对象成员可通过类名直接访问,支持实现接口和扩展函数
五、继续与接口:明确开放原则

  1. open class Animal(val name: String) {
  2.     open fun makeSound() = "Generic animal sound"
  3. }
  4. class Dog(name: String) : Animal(name) {
  5.     override fun makeSound() = "Woof!"
  6. }
  7. interface Swimmer {
  8.     fun swim() {
  9.         println("Default swimming implementation")
  10.     }
  11. }
复制代码
关键点:
• 类/方法默认final,需open允许继续
• override逼迫要求显式声明重写
• 接口支持默认方法实现
六、属性访问器:精细化控制

  1. class Temperature {
  2.     var celsius = 0.0
  3.     var fahrenheit
  4.         get() = celsius * 9/5 + 32
  5.         set(value) {
  6.             celsius = (value - 32) * 5/9
  7.         }
  8. }
  9. val temp = Temperature()
  10. temp.fahrenheit = 68.0
  11. println("${temp.celsius}°C") // 输出20.0°C
复制代码
通过自界说getter/setter实现:
• 数据格式转换
• 输入有效性验证
• 延迟初始化
• 访问日志记录
七、密封类 vs 摆列类

密封类(Sealed Class)
  1. sealed class Result<out T> {
  2.     data class Success<T>(val data: T) : Result<T>()
  3.     data class Error(val exception: Exception) : Result<Nothing>()
  4.     object Loading : Result<Nothing>()
  5. }
  6. fun handleResult(result: Result<Int>) = when(result) {
  7.     is Result.Success -> println(result.data)
  8.     is Result.Error -> println(result.exception)
  9.     Result.Loading -> println("Loading...")
  10. }
复制代码
优势对比摆列


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


  • 密封类是抽象的,不能直接实例化
  • 密封类的子类可以是类、对象或数据类
  • 密封类的子类必须在与密封类相同的文件中声明

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表