将Java迁移到Scala
当逐步将现有Java代码库迁移到Scala时,需要注意的最重要的一点是什么,以及解决方法是什么?有一个(可能很长)中间阶段,两种语言都在使用 我想的是:将Java迁移到Scala,java,scala,migration,scala-java-interop,Java,Scala,Migration,Scala Java Interop,当逐步将现有Java代码库迁移到Scala时,需要注意的最重要的一点是什么,以及解决方法是什么?有一个(可能很长)中间阶段,两种语言都在使用 我想的是: 不同的集合层次结构 Scala无法很好地处理的Java构造 在Java中无法使用的Scala构造 构建工具 编撰顺序 框架中的不变性支持 等等 最初(即迁移的第一阶段),我想说的是,您不希望导出带有难以使用的fromJavaScala构造的API(接口/公共方法等) 在实践中,我会将此限制为导出任何特定于scala的内容(这里再次讨论迁移的第
- 不同的集合层次结构
- Scala无法很好地处理的Java构造
- 在Java中无法使用的Scala构造
- 构建工具
- 编撰顺序
- 框架中的不变性支持
- 等等
- scala库类(函数类型、集合等)
- 高级泛型类型签名
- 含蓄的
java.util.concurrent
)。当然,这可以按原样进行转换,但问题是是否要将基于around锁定的并发模型替换为基于around锁定的并发模型。在任何一种情况下,这都可能是一次完全的重新设计,而不是转换本身。Scala不喜欢:
- 内部Java类
- 静态方法和变量(特别是在超类中)
- 原始类型
- Scala对象特性
- 闭包
- 演员(斯佳丽·约翰逊和阿克卡演员除外,因为他们有Java API)
- 含蓄的,尤指显化的
- 高级类型构造(高级类型、结构类型、抽象类型变量)
- 我将补充其他人所说的内容,因为他们是正确和有意义的。除了代码,您还需要进行单元测试。这听起来并不难,直到你开始改变易变性和线程结构,同时仍然试图让一切都像以前一样工作。在迁移过程中,在发现迁移过程中可能引入的其他边缘情况时,记住所有边缘情况非常重要
如果您将单元测试引入一个好的Scala测试框架,比如ScalaTest,并进行直接转换,您可能会发现您正在测试的内容与您之前测试的内容不同。在进行迁移时,重要的是要将代码的意图与测试保持在一起,而不是允许思想的碎片化。我喜欢使用的一个技巧是,我将使用惯用的Scala属性(VAL和VAR)定义一个对象,然后添加
@BeanProperty
注释以作为JavaBean属性公开。这样,每种语言都可以使用当地的习语
@BeanInfo
注释也可以在类级别上用于类似的目的,但在这里您必须小心-当使用@BeanInfo时,您另外自定义定义为setXXX或getXXX的任何方法都不会通过bean内省公开。这一点很重要,因为如果您还想处理Scala列表和Java列表之间的转换,则必须手动编写集合类型的getter/setter。David Copeland做了一个很好的演示,它可能会给您一些关于这个主题的见解 +1只是为了让斯佳丽J.参与你的回答。其余的也不错。如果有照片会更好!斯卡拉·约翰逊也是一名优秀的演员:)我希望斯佳丽·约翰逊仍然是一名演员。如果你发现了某种性别改变手术,我会非常失望的。如果是真的,我现在只把他/她/它称为过去美好记忆中的“伤疤”。哦,这是一个很好的问题。有趣而平衡的演示,非常有用。我能马上想到的事情与您当前拥有的任何类型的测试有关,因为您可能会首先使用测试来更改核心代码,以防止回归。迁移时这些测试可以保持不变吗?或者它需要同时更改并可能引入bug吗?Scala非常支持混合源项目,因此您可以一次转换一个类,并在整个转换过程中保持测试套件的运行。请参阅有关设置的和文档。与任何其他行为更改一样,测试也应更新以反映这一点。甚至可以先迁移测试,这样您就可以确切地理解代码是如何工作的。如果代码已经很大,请不要这样做。Scala不喜欢很多java期货,反之亦然。旧的、大的、经过测试的应用程序不值得您做这些工作。这里所有的答案都与任何试图向现有Java代码库添加新Scala代码的人有关。不可避免地,将对现有代码进行一些转换以帮助解决此问题。但总体而言,我同意,没有必要改变一些没有坏掉的东西,或者没有给你带来问题的东西。