1

【译文】Java 21 – Kotlin 是否正在消亡?

 1 month ago
source link: https://www.techug.com/post/java-21-is-kotlin-dying/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大多数人可能都知道,2023 年 9 月 19 日,JDK 21 正式推出,这使得使用它成为一个不错的主意。现在,距离该版本问世已经过去了半年时间,Kotlin 是否仍然有用,尤其是从后端编程的角度来看,值得了解一下。Kotlin 曾是替代 Java 的优秀编程语言,加快了多个开发和项目的进程,但随着新功能的推出,情况是否依然如此呢?在本文中,我们将深入了解 Java 21 中的三大新改进及其在 Kotlin 中的类似部分,即虚拟线程、模式匹配和重构。

虚拟线程(Project Loom)与 Coroutines

在 Java 21 中,并发性方面还有一个巨大的改进–虚拟线程(Virtual Threads)。无论何时您想创建普通线程,或者让执行器服务管理这些线程,这都是相当昂贵的操作。有了创建多个可快速并发运行的轻量级任务的可能性,就能更轻松地提高代码效率。

这里的关键问题是:既然使用这些线程工作非常相似,那么使用这些虚拟线程是否会有任何性能上的缺陷,或者是不同的缺陷?

根据多个讲座和文章,简短的答案是:没有:

虚拟线程不会取代Coroutines!

另一方面,长答案是

虚拟线程和例行程序都有不同的用例,并且会根据我们想在其中执行的操作做出不同的反应。目前,有两种解决方案可用于不同的用例,每个开发人员都必须了解是否应该使用哪一种。虚拟线程的另一个优势是使用相同的线程 API,这使得将旧代码更新为最新实践变得更加容易。对于 Kotlin 例程来说,它更倾向于基于事件的系统和高并发代码。Coroutines 目前支持开箱即用的结构化并发,而 Java 目前还不支持(虽然已经进入预览版)。

这里的关键是确保您了解使用这两种工具的优缺点。

请看下面的代码

public class Main {
  public static void main(String[] args) {
      Point simplePoint = new Point(1, 2);
      Point3 point3Dimensions = new Point3(1, 2, 3);

      print(simplePoint);
      print(point3Dimensions);
  }

  static void print(Object p) {
      switch (p) {
          case Point point -> System.out.println(point);
          case Point3 point3Dimensions -> {
              System.out.println("I found point 3:");
              System.out.println(point3Dimensions);
          }
          default -> System.out.println("Other");
      }
  }
}

正如你所看到的,现在创建一个 switch case 语句非常简单,我们已经在 switch 语句中获得了对象的类型。我们可以访问字段和方法,无需将结果转换为给定类型,就能轻松地进一步评估下一个信息。

Kotlin 中也有非常类似的解决方案:

when (event) {
        is Result.OK -> {
            println("Success: ${event.data}")
        }
        is Result.Error -> {
            println("Error occurred: ${event.errorMessage}")
        }
    }

由于 Java 中已经提供了这一功能,Kotlin 相对于 Java 的这一优势似乎被削弱了。

让我们使用前面例子中类似的 Java 代码:

static void print(Object p) {
    switch (p) {
        case Point(var x, var y) -> System.out.println(x);
        case Point3(var x, var y, var z) when x > 0 -> {
            System.out.println("I found point 3:");
            System.out.println(y);
        }
        default -> System.out.println("Other");
    }
}

正如你所看到的,现在我们可以立即对记录进行重组,并立即访问我们需要的字段,以便进一步进行操作。不仅如此,我们还可以根据给定变量是否满足条件执行更多操作和指令。

这与使用多条件的 Kotlin when 语句非常相似,但必须在之后进行重构。

when (point) {
    is Point -> {
        val (x, y) = point 
        println("X: $x, Y: $y")
    }
    else -> println("unknown point")
}

从这三点来看,Java 21 和 Kotlin 之间的差异似乎正在缩小。我相信在未来,当 Kotlin 的所有新功能(不仅仅是这 3 点)都出现时,人们就不会再去研究 Kotlin,而是会去研究 Java,因为有更多的工具可以快速、轻松地集成,而且不会出现任何奇怪的兼容性问题。

本文文字及图片出自 Java 21 - Is Kotlin Dying?

O1CN01hHIF631OQdoepzxaf_!!2768491700.jpg_640x640q80_.webp

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK