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

大多数人可能都知道,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?

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注