Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java迁移到Scala_Java_Scala_Migration_Scala Java Interop - Fatal编程技术网

将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的内容(这里再次讨论迁移的第

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

我想的是:

  • 不同的集合层次结构
  • Scala无法很好地处理的Java构造
  • 在Java中无法使用的Scala构造
  • 构建工具
  • 编撰顺序
  • 框架中的不变性支持
  • 等等
最初(即迁移的第一阶段),我想说的是,您不希望导出带有难以使用的fromJavaScala构造的API(接口/公共方法等)

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

  • scala库类(函数类型、集合等)
  • 高级泛型类型签名
  • 含蓄的
那剩下什么呢?好的,类的内部(私有方法、字段等)可以转换为使用scala构造和库类

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

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

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

Scala不喜欢:

  • 内部Java类
  • 静态方法和变量(特别是在超类中)
  • 原始类型
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代码的人有关。不可避免地,将对现有代码进行一些转换以帮助解决此问题。但总体而言,我同意,没有必要改变一些没有坏掉的东西,或者没有给你带来问题的东西。