应该在Scala中编写Java应用程序的哪些部分?

时间:2009-09-21 02:03:59

标签: java scala interop

我正在使用Struts 2编写一个Java应用程序,但是现在我想把它变成一个混合的Java&相反,Scala项目。我对Scala没有多少经验,但几年前我在大学时学过Haskell - 我真的很喜欢功能性编程范例,但当然在课堂上我们只能得到非常适合功能性解决方案的问题!在现实世界中,我认为一些代码更适合命令式样式,我想继续使用Java(我知道Scala支持命令式语法,但我还没准备好朝着纯Scala项目的方向发展) (还)。

在混合项目中,如何决定用Java编写代码以及在Scala中编写什么代码?

4 个答案:

答案 0 :(得分:10)

两件事:

  1. 99%的Java代码可以用Scala表示
  2. 您可以编写支持混合Java + Scala编译的项目。您的Scala代码可以调用您的Java代码,您的Java代码可以调用您的Scala代码。 (如果你想做后者,我建议用Java定义接口,然后在Scala中实现它。否则,从Java调用Scala代码可能会有点难看。)
  3. 所以答案是:你想要的任何部分。您的Scala代码不需要纯粹功能。您的Scala代码可以调用Java库。所以你可以用Java编写的任何部分都可以用Scala编写。

    现在,一些更实际的考虑因素。当第一次尝试使用Scala时,有些人会选择相对孤立的非任务关键部分来编写Scala。如果您喜欢这种方法,单元测试是一个很好的选择。

    如果您熟悉Java并且过去曾学过Haskell,我建议将Scala视为“更好的Java”。从根本上说,Scala编译为与Java输出非常非常相似的JVM字节码。唯一的区别是Scala更“高效”:每行代码产生的字节码比Java更多。 Scala与Haskell有很多共同之处(一等函数,for-comprehension就像Haskell的do-notation,有限类型推理),但它也非常不同(默认情况下它不是懒惰的,它不是纯粹的)。因此,您可以使用Haskell的一些见解来激发您的Scala风格,但“引擎盖下”它是所有Java字节码。

答案 1 :(得分:6)

根据您的问题的精神,我建议您在Scala中编写任何涉及对集合进行大量操作或处理XML的代码。

Scala的集合库是Scala最重要的功能特性,通过它的使用,您将体验到大量的LoC减少。是的,有Java备选方案,例如Google的集合库,但您询问了您应该在Scala中编写的内容。 : - )

Scala还具有XML的本机处理功能。如果您尝试使用DOM代码并使其在Scala上运行,您可能会发现转换很困难。但是,如果您尝试解决问题和Scala透视图并从头开始为Scala编写,那么您将获得收益。

我也建议使用Actors,但我不确定你能用Java上的Struts 2代码集成它。但是如果你有并发代码,那就给Scala中的Actors一个想法。

答案 2 :(得分:5)

这可能听起来很愚蠢,但为什么不在Scala中编写整个项目?它是一种非常出色的语言,比Java更具表现力,同时保持对现有Java库的二进制兼容访问。

答案 3 :(得分:3)

问你项目的这些问题: “什么操作需要副作用?”和“Java库已经涵盖了哪些功能?”然后在Scala中实现其余部分。

但是我会警告混合项目本质上比独立项目更困难,因为您需要使用多种语言/环境。因此,鉴于您声称对Scala没有多少经验,我建议您先玩一些玩具项目,也许是您完整目标的一部分。这也可以让你了解应该发生分歧的地方。