将 Java 迁移到 Scala

2022-09-01 13:01:28

在逐步将现有的Java代码库迁移到Scala时,需要注意的最重要点和解决方法是什么?具有(可能很长的)中间阶段,其中两种语言都在使用中。

我正在考虑的事情是:

  • 不同的集合层次结构
  • Scala无法很好地处理的Java结构
  • 在Java中使用不切实际的Scala结构
  • 构建工具
  • 编译顺序
  • 框架中的不可变性支持
  • 等。

答案 1

Scala不喜欢:

  • 内部 Java 类
  • 静态方法和变量(特别是在超类中)
  • 原始类型

Java不喜欢:

  • Scala 对象特征
  • 闭 包
  • actor(除了Scarlett Johansson和Akka Actors,因为他们有一个Java API)
  • 隐式,尤其是清单
  • 高级类型构造(高级类型、结构类型、抽象类型变量)

答案 2

最初(即迁移的第一阶段),我会说你不想导出一个API(接口/公共方法等),其中包含一个难以使用的Java scala结构。

在实践中,我会将其限制为导出任何特定于scala的内容(再次,我在这里谈论的是迁移的第一阶段):

  • scala 库类(函数类型、集合等)
  • 高级泛型类型签名
  • 隐式

那么这会留下什么呢?好吧,类(私有方法,字段等)的内部可以转换为使用scala构造和库类。

如果你有任何API(特别是你打算迁移的面向客户端的API),我会在Scala中从头开始设计它们;最初使用 Java 后端。然后我会慢慢地吃掉中间的代码。

在你强调的要点中,我同意Scala的不可变范式和Java的可变范式不能很好地混合在一起。我发现其他几点问题不大。

范式不匹配的另一个主要点是如何转换您拥有的任何并发代码(即使用 )。当然,这可以按原样转换,但问题是是否要将基于锁定的并发模型替换为基于参与者或STM并发模型。在任何一种情况下,这也可能是完全的重新设计,而不是转换本身java.util.concurrent


推荐