惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Vercel News
Vercel News
C
Check Point Blog
G
Google Developers Blog
博客园 - 司徒正美
量子位
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
A
About on SuperTechFans
美团技术团队
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Cloudflare Blog
U
Unit 42

smallyu的博客

为什么买的加密货币一定要去中心化 RISC-V 虚拟机无法代替 EVM 虚拟机 Polkadot 的 Existential Deposit 机制错在哪里 利息,套利,交易策略,金融市场 LayerZero 从来不挑战比特币的地位 默认参数引起的以太坊节点运行错误 硬件钱包与资产安全 预测市场比币圈更赌场 为什么去中心化的跨链桥不可能实现 我对于 AI 时代的答案 不要投资任何隐私币 区块链技术世界的三大真理 以太坊 AA 钱包的致命问题是什么 基于 AI 语义执行的 MCP 区块链的设计 一个集成 Geth 和 CometBFT 的兼容层 我的加密货币定投策略(二) DeFi 基础: 理解 AMM 定价机制 Go 语言 GMP 调度器的原理是什么 Web3 项目分析计划 对 Psyche Network 项目的分析 continuation 教程: 理解 CPS 如何开发一个比特币符文(Runes)协议 比特币脚本开发教程 我从王垠的计算机科学视频班学到了什么 区块链技术面试题(2025年版) Rust 语言容易让新手困惑的一个“过度优化” Solana 智能合约开发教程 (1) 尝试开发一个最小 EVM 虚拟机 基于 ZK 的链上身份系统设计 一个 Web3 打赏系统的设计
Kotlin:简化版的 Scala
2019-07-06 · via smallyu的博客

2019-07-06

行走江湖的剑客,必然要有一柄趁手的宝剑。好的程序语言就像一把好剑,重量合适,拿着舒服,挥舞起来优雅,杀伤力过关。Kotlin官方对待Kotlin和Scala的关系是,“如果你玩Scala很happy,那你就不需要Kotlin。”

脚本化

Scala执行的基本单位和Java一样是类,而Kotlin允许文件中的main方法直接运行,不需要类。Java的入口函数定义在类中:

public class Java {
    public static void main(String[] args) {}
}

Scala的入口函数定义在样本类而不是普通的类中:

object Scala {
  def main(args: Array[String]): Unit = {}
}

Kotlin的入口函数则直接定义在.kt文件中,相应的,Kotlin的类仅相当于一种数据结构,类中无法定义入口函数:

fun main(args: Array<String>) {}

构造函数与单例模式

Kotlin的构造函数同Scala一样写在类定义处,因此也无法像Java的构造函数一样直接写入初始化代码。Kotlin中使用init代码块来执行初始化程序:

class Test(arg: String) {
    init {
        println("This string is ${arg}")
    }
}

fun main(args: Array<String>) {
    val test = Test("smallyu")
}

// This string is smallyu

如果需要第二个构造函数,就要使用类似ES6的constructor函数,或者类似Scala的辅助构造器。这实在是丑陋的写法,相比之下Java真的友善多了。

class Test(arg1: String) {
    init {
        println("This string is ${arg1}")
    }
    constructor(arg2: Int): this("smallyu2") {
        println("This int is ${arg2}")
    }
}

fun main(args: Array<String>) {
    val test = Test(1)
}

// This string is smallyu2
// This int is 1

Kotlin的构造函数是需要用constructor关键字定义的,默认可以省略,但如果要加权限修饰符自然就不能省了。在Kotlin中实现单例模式的思路与Java相同,让构造器私有,然后通过静态方法暴露实例:

class Test private constructor() {
    companion object Factory {
        fun create(): Test = Test()
    }
}

fun main(args: Array<String>) {
    val test = Test.Factory.create()
}

Kotlin中的object定义静态代码块,companion允许在类内部定义静态代码块,因此compaion object定义了类外部可以访问的方法create()。

getter和setter

Kotlin另一个有趣的玩意儿是getter和setter。前端框架React或Vue实现数据双向绑定的原理即使用Object.defineProperty()定义对象的getter和setter,使得对象的变化可以实时同步到页面上。Kotlin提供了对属性getter和setter的支持:

var test: Int
    get() {
        println("There is test getter")
        return 2
    }
    set(arg) {
        println("The setter arg is ${arg}")
    }

fun main(args: Array<String>) {
    println(test)
    test = 3
}

// There is test getter
// 2
// The setter arg is 3

其他

开始对Kotlin感兴趣是因为发现Kotlin竟然支持协程,如果Kotlin真的有语言级别的协程支持,加上运行在Jvm上的特点,以及能够开发多平台应用包括Server Side、Android、JavaScript、Native,那Kotlin无疑是异常强大的编程语言。然而事实上Kotlin的协程只是一个扩展包,甚至还需要使用编译工具来引入,对协程的支持还是Go语言独大。用于JavaScript平台也是个幌子,并没有比TypeScript好用,至于Android和Native本身也是Java的应用场景……

Kotlin提供了许多语法糖,看似可以简化程序员的代码量,但是为了熟练应用Kotlin的特性,使用者又不得不搞清楚类似data class的概念,就像Scala的case class一样。Kotlin的学术性弱于Scala,工程能力又不比Java有大的优势。Go语言虽然另辟蹊径,语言特性上有广为诟病的地方,但是看着爽,写着也爽。所以Kotlin和Scala一样,并不会有广泛的应用前景。也就是说,它并不会是下一个很流行的编程语言。