Scala成为新的Java?

33

我最近有空就开始探索Scala。

不得不说,到目前为止我对它印象非常好。Scala建立在JVM之上,可以无缝地与现有的Java代码集成,并且拥有许多Java所没有的特性。

除了学习一门新语言,转换到Scala还有什么缺点吗?


9
缺乏与Java相媲美的IDE支持。 - akarnokd
7
Java需要IDE的支持,因为它需要大量的样板代码。如果Scala足够简单,那么可能就没有真正需要IDE的必要了。 - Bastien Léonard
23
“没有必要使用集成开发环境”可以称之为一个有争议的观点。 - oxbow_lakes
13
只要没有只有一个功能的语言(readMyMindFixMyDesignIssuesAndDoWhatINeed();),就会一直需要好的集成开发环境。@Bastien - jsight
4
Scala的模式匹配是需要良好的IDE支持的一个方面。 - akarnokd
显示剩余4条评论
9个回答

26

嗯,不足之处在于你需要准备好Scala可能有些粗糙:

  • 你会遇到偶尔的加密Scala编译器内部错误
  • IDE支持不如Java(调试支持也是如此)
  • 未来版本中将会有一些向后兼容性的问题(尽管这些问题将是有限的)

作为一种语言,你还必须承担Scala可能消失的风险。

话虽如此,我认为你不会后悔选择Scala!总体而言,我的经验是积极的;IDE可用,你会习惯于理解加密的编译器错误,并且当你的Scala代码库很小时,向后兼容性的问题并不是一个主要麻烦。

值得去尝试使用Scala的原因包括:Option、集合的单子功能、闭包actors模型、提取器、协变类型等。这是一门令人惊叹的语言。

从不同角度解决问题对个人也非常有益处,而以上构造可以实现和鼓励这种方法。


有推荐的免费集成开发环境吗? - Liran Orevi
1
Miles Sabin最近在伦敦Scala用户组发表了一次演讲,他表示Eclipse插件的下一个版本(将与Scala 2.8同时发布)将比当前版本更加稳定、快速和优秀。 - oxbow_lakes
我一直在使用带有Scala插件的NetBeans 6.7,到目前为止感觉还不错。 - cdmckay
Scala插件甚至无法在我的Eclipse Indigo中安装 - 必须降级到Eclipse Helios。 - DNA

16
Scala的一些缺点与语言相对年轻无关。毕竟,Scala已经有大约5年的历史了,而Java在自己的寿命中的前5年非常不同。
特别是,由于Scala没有一个企业支持并将其视为战略重点,因此其支持资源相当匮乏。例如:
- 缺乏广泛的教程 - 文档质量较低 - 文档本地化不存在 - 本地库(Scala使用Java或.NET库作为基础)
另一个重要的区别是Sun如何看待Java和EPFL如何看待Scala。Sun将Java视为获取企业客户的产品。 EPFL认为Scala是一种旨在成为比现有语言更好的语言,在某些方面(OOxFunctional集成和类型系统设计)上特别如此。
因此,Sun使JVM非常稳定,Java完全向后兼容,几乎不删除功能,而生成使用一个版本的Scala的JAR文件将根本不能与其他版本一起使用(这对第三方库来说是一个严重问题),语言不断增加新功能以及实际删除已被弃用的功能,Scala的库也是如此。我认为Scala 2.x的修订历史仅有不到3年,但却给人留下了深刻印象。

最后,由于以上所有原因,Scala的第三方支持初露端倪。但需要注意的是,JetBrains公司一直支持Scala,他们通过销售IntelliJ IDEA IDE获得收益,并不断改进其支持。这意味着对第三方支持有需求,支持必将增加。

我指出了书籍情况。一年前市场上没有Scala的书籍。现在市场上有两三本Scala入门书籍,到年底应该会有同样数量的书籍,还有一本关于基于Scala的非常重要的Web框架Lift的书籍。

我打赌我们不久将会看到一本关于ESME的书籍,以及关于Scala和并发性的书籍。出版市场显然已经达到了临界点。一旦发生这种情况,企业也将跟随。


我认为关于Scala未来在“企业”领域的应用前景有一些非常有趣的博客,但不幸的是它们尚未被撰写 :-( - oxbow_lakes
你说得对,只有大约4本书在写这个。那么人们怎么能学会呢? - Rayne
Rayne,我觉得你没有理解我的意思。我的意图是要表明Scala书籍市场正在迅速增长,一年之内从0跃升至5或6本。 - Daniel C. Sobral

15

去年,我解除了J2EE的束缚,想尝试些新的东西。在企业中使用Java 12年,为世界上一些最大的公司构建了非常庞大的系统。

我以前尝试过Ruby on Rails。构建了一些示例应用程序后,我不喜欢它的感觉,或者说不喜欢需要编写大量单元测试来覆盖通常由编译器完成的任务。

Groovy on Grails是我的下一个选择。我必须说我很喜欢它,但它也存在与ROR相同的动态类型问题。别误解我,我并不是贬低Grails,因为它是一个很好的框架,我仍然会使用它。在我看来,每个框架都有其适用场景。

然后我尝试了Scala,并基于Scala和Spring MVC构建了一个混合应用程序。起初,使用Scala很困难,但随着你投入更多时间,它会变得更容易和高效。我已经到了一个转折点,现在想要在Lift中投资时间。

《Programming in Scala》和David Pollak的《Beginning Scala》书籍结合起来学习语言是不错的,后者比较实用。

Scala仍然很年轻,还有很长的路要走。但我认为它有着光明的未来,我看到已经出现了势头。最近,Groovy语言的创建者之一在博客中说,如果当时Scala存在的话,他就不会费心设计Groovy。

我认为,在更好地集成/包装Java API方面进行更多的工作将使Scala获得需要赢得更多追随者的推动力。基本的集成已经存在,但我认为还可以进一步改进。是的,IDE支持是存在的,但目前还比较基础。Intellij的强大重构支持还不存在,我非常怀念那个功能。编译器+ IDE支持以及其他插件的混合使用还不够成熟。有时,由于Scala与Goggle应用引擎的JDO增强的原因,我会遇到非常奇怪的内部编译器错误。然而,这些都是可以轻松修复的小问题。早期采用新技术和语言总是伴随着一些痛苦。但是这种痛苦可能会在未来带来巨大的乐趣。

如果我比较Scala与早期Java的能力,那么它遥遥领先。当我从C++转向Java时,JVM在可扩展性方面还没有准备好。在各种操作系统上,以前曾经出现过很多奇怪的崩溃和JVM core dump。但是现在Java已经解决了所有这些问题,JVM非常稳定。Scala运行在JVM上,因此它在本地平台集成方面拥有巨大的优势。它站在巨人的肩膀上!

经过多年的构建和支持企业应用程序,我认为编译器可以捕捉大部分非功能性错误,甚至在构建单元测试之前就可以检查这些错误的语言最好。我喜欢类型检查与函数式编程的结合所带来的强大能力。我喜欢我正在做的面向对象++。

我认为开发社区将决定Scala是否是未来。现在采用Scala的缺点是,如果它没有走向成功并且没有得到广泛的适应,那么维护Scala代码库将非常困难,因为Scala开发者非常少。然而,我看着Java从鼹鼠工程推向企业,取代C++,它完全是由开发社区推动的。对于Scala来说,时间会证明一切,但目前我支持Scala。


4

除了学习一门新语言之外,转换到Scala有什么劣势吗?

思考,思考,再思考...... 没有,没有任何劣势 :-)


3

我认为没有任何缺点。实际上,学习新的编程语言对于扩展你的编程知识非常有帮助。你可能会从Scala中获得一些东西,例如通用类、变异注释、上限和下限类型边界、内部类和抽象类型作为对象成员、复合类型、显式类型自引用、视图和多态方法。


3
我将告诉您我的个人经验,以及我如何发现在现有的Java库中集成Scala并不那么容易:
我想从简单的东西开始,并且我认为Scala非常适合科学计算,所以我想做一个JAMA(Java矩阵库)的包装器... 我最初的方法是用Scala类扩展Matrix类型,然后重载算术运算符并调用Java本地方法,但是:
- Matrix类没有提供默认构造函数(无参数) - Scala类需要一个主构造函数 - 我认为一个好的主构造函数可以接受一个Array [Array [Double]](第一件令人沮丧的事情是,该语法比Double [] []更冗长且难以阅读) - 据我所知,通过阅读手册,主构造函数的参数也是类的隐式字段,因此我将在Scala子类中结束一个Array [Array [Double]]和在Java超类中结束另一个double [] [],这相当冗余。
我认为我可以使用一个空的主构造函数来初始化具有一些默认值(例如[[0]])的超类,或者只需制作一个使用Jama.Matrix作为代理的适配器类,但是如果一种语言应该优雅并且与其他语言无缝集成,那种事情就不应该发生。
这就是我的两分钱。

2
请查看我的博客(http://dcsobral.blogspot.com),我在那里研究并解决这些问题。对于这样的情况,您可以声明一个接收Matrix的私有构造函数,并以此为基础创建其他构造函数,或者在私有构造函数中根本不使用参数。这些特性困扰了您,但它们有非常好的原因,也有方法可以解决它们。 - Daniel C. Sobral
1
继承并不是实现包装器的唯一方法!您可以在自己的类中包含Matrix类型的实例。 - Seun Osewa
1
如果你正在编写一个适配器类,可以使用隐式转换将其用于 Java 函数中。@fortran - Elazar Leibovich
4
简而言之,如果将函数implicit adapter2matrix(a:Adapter):Matrix = a.innerMatrix添加到范围中,Scala会自动将对INeedJavaMatrix(AdaptorClass)的调用转换为INeedJavaMatrix(adapter2matrix(AdaptorClass))。详情请参考http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6。 - Elazar Leibovich
1
@Elazar:这就是我使用隐式类型转换将许多遗留代码移植到Scala的方式;它充分利用了Scala的强大功能。 - Nathan Moos
显示剩余3条评论

2
它经常破坏向后兼容性。 社区规模较小。 尚无IDE支持。
否则还好。 它只是一种年轻的语言,最终会到达那里。 非常适合业余爱好者,不适合企业使用。

13
有人需要告诉EDF、Twitter和我,它还没有准备好迎接企业级需求。 - oxbow_lakes
我认为可扩展性不是问题,但我也不会因为维护不向后兼容的东西而怨恨他们所做的工作。 - Alex
6
@Rayne,如果你将鼠标悬停在oxbow_lakes的评论左侧,会出现一个小上箭头。按下它会更简洁地表达你刚才说的话。而且Scala不是非常注重简洁的代码吗? - Elazar Leibovich

1

我所说的两个,其实是四个最大的缺点:

  • 许多在专业社区中担任开发人员的人没有接受过培训,并且不愿意学习如何使用函数编程语言,甚至不愿尝试,因此无法理解为什么这是更好的方法。这意味着除非企业层面强制规定,否则您将始终在推广方面处于劣势。

  • 关系型数据库集成仍然有些不稳定。虽然有很多解决方案,但没有一个真正突出的标准。但对我来说,这可能是一个优势而不是一个缺点。 JPA2很乱,引发的问题比解决的问题还要多。Hibernate标准查询也不是很好。

  • IDE支持仍然滞后,但主要是在调试方面。代码检查做得相当不错(至少在IntelliJ中)。

  • 再也不想写Java代码了!一旦被迫返回Java笨拙的语法,你可能会想砸墙或打东西。


你的计数方式和我的不同。 - Dave Newton
哎呀 - 我原本有两个,然后我又加了一些 :D - PlexQ
2
编程只有两件难事:命名、缓存失效和一错再错的错误。 - DNA

0

这里的答案有些过时,大约是在2022年左右,所以我想提供一些更新。我一直在一家科技公司工作,该公司开始使用Scala的时间与最初提出这个问题的时间差不多。最近,我在博客中谈到了在尝试教Java开发人员如何处理用习惯性Scala编写的代码库时学到的经验教训,所以这个话题现在对我来说非常重要。

  • 几乎所有工具、教育资料和集成方面的成熟问题都已经解决。Scala的第二版与Java的第8版或第11版一样稳定可靠。
  • 切换到Scala的一些最明显的优势已经不再相关,因为这些语言特性已经添加到了更新版本的Java中。
  • Scala继续在模块化和可读性方面胜过Java,这使得习惯性Scala能够比Java更好地处理代码复杂性。
  • 这种改进的代码可扩展性的代价是更高的学习曲线,这使得Scala对初级开发人员不太有吸引力,而他们往往占据您的工程团队的大多数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接