第 12 章 从函数到运算符 从函数到运算符
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
如果我们有一个庞大的 Java 代码库,我们的 Java 和 Kotlin 将不得不共存一段时间。 在我们逐渐将系统翻译成 Kotlin 的过程中,我们可以做些什么来支持两种语言的约定俗成呢?
到目前为止,我们已经展示了从 Java 到 Kotlin 的一次性代码转换,我们使用了自动重构来安全地完成转换,但到最后,所有受影响的代码都转换成了惯用的 Kotlin。
在 大型代码库中,这并不总是可能的。我们必须在引入 Kotlin 的同时继续发展 Java 中的功能。在两者之间存在边界的地方,我们希望一边使用传统 Java,一边使用传统 Kotlin。当我们转换支持系统大量功能的基础类时,这一点尤为重要。
基础课:金钱
每个系统都包含一些基础类,代码库中的许多部分都会用到这些类。Travelator 中的一个例子是Money 类,我们在第 3 章中第一次看到了这个类。旅行者需要为自己的旅行做预算。 他们希望比较不同旅行方案的成本,查看这些成本转换成自己喜欢的货币的情况,预订各种东西,支付各种费用,等等。
Money 类的使用非常广泛,我们不可能一下子就将它和依赖于它的所有代码转换为惯用的 Kotlin。在转换过程中,我们必须继续在 Java 和 Kotlin 中开发使用Money 的功能。
这样,我们就只能在 Scylla 和 Charybdis 之间徘徊。我们是将Money 保留为 Java 类,同时将依赖于它的代码转换为 Kotlin,但同时限制依赖代码中可以使用的 Kotlin 功能?还是在仍有 Java 代码使用Money 类的情况下将其转换为 Kotlin,允许我们在依赖代码中使用 Kotlin 功能,但让剩余的 Java 代码变得不一致、不规范?
我们甚至有这些选项,这证明了 Kotlin/Java 互操作在两个方向上的良好效果。 实际上,我们不必做出选择。通过一些狡猾的重构策略和一些 注释来控制 Kotlin 编译器如何为 JVM 生成代码,我们可以获得两个世界的最佳效果。我们可以在 Kotlin 中定义Money ,让我们能够利用 Kotlin 的功能,同时还为 Java 代码提供一个惯用的 API,并对其进行维护。
我们在第 3 章将Money 类转换成了 Kotlin。由于我们将其留在了该章的最后,所以我们(没有你,抱歉)能够在不影响依赖于它的 Java 代码的情况下让代码更加简洁。我们将大部分方法重构为单表达式形式(第 9 章),并利用 Kotlin 的流敏感类型推断大大简化了equals 方法。
现在是Money 。它没有明显的不同,但减少了很多语法噪音:
classMoneyprivateconstructor(valamount:BigDecimal,valcurrency:Currency){overridefunequals(other:Any?)=this===other||otherisMoney&&amount==other.amount&¤cy==other.currencyoverridefunhashCode()=Objects.hash(amount,currency)overridefuntoString()=amount.toString() ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access