Java开发人员如何看待Scala?[关闭]


19

我注意到IDE的支持远非如此,但该语言本身更清晰地支持函数式编程习惯用法。


3
Python是我的信仰,所以我只关心Guido对Scala的看法。neopythonic.blogspot.com/2008/11/scala.html
工作

7
Scala是一种很棒的语言,它不仅吸引了Scala社区所有的伟大思想,而且可悲的是,许多令人羡慕的仇恨者试图从根本上找到任何东西来攻击这种语言以及使用它的人们。
soc 2010年

@soc:明确一点:我不讨厌Scala,使用它的人可能不会(应该!)不在乎对它的想法。我认为这太复杂了。就这样。对于那些有头脑的人来说,复杂性可能没问题。我不会:-)
乔纳斯·普拉卡

3
抱歉,当人们不断重复神话而不支持自己的主张时,我很生气。
soc 2010年

2
@soc:嗯,整个问题完全是主观的,所以任何答案都是正确的,无论是神话还是不神话。
Joonas Pulakka 2010年

Answers:


18

我已经为Scala编程了一年多了,所以我会花一年时间回答这个问题。

  • Scala代码比Java代码更简洁(没有设置器或获取器,可以推断出很多类型信息)
  • 对XML文字的内置支持非常吸引人。
  • Java库兼容性和互操作性很棒
  • 对某些功能用法的支持令人耳目一新(用于理解,闭合,lambda函数,映射,折叠,缩小)
  • 语言创建者似乎并没有提供一个很酷的功能

上面的几点或多或少是我开始学习Scala之前所想到的。

在一年的时间里,这是我发现的:

  • 楼梯本是一笔巨大的投资,节省了我数小时的学习时间
  • 语法有些古怪,有时候我真的很困惑为什么有些东西无效。折衷方案是一旦您熟悉了,代码将变得更整洁,更易于阅读。请注意,如果您阅读而不是编写代码,这实际上不是问题。
  • 2.8中的收藏库很高兴使用。很难再回到Java了。
  • XML文字很不错,但是除了一些基本的知识之外,我还必须接触Java库生态系统。不过很方便。
  • 使用Scala中的Java库非常简单方便。使用Java中的Scala类会比较棘手,但是可以。
  • 我已经切换到IntelliJ IDEA社区版,尽管它并不完美,但已经足够了。
  • 语言创建者确实在考虑功能集,并且所有功能都可以很好地协同工作。面向对象的支持要比Java(带有特征)更好,并且您可以进行函数式编程。
  • 这种语言显然有些Java开发人员非常讨厌。对我来说,它带回了编程的乐趣。

21

好吧,我认为Scala太复杂了。感觉就像C ++,因为它有无数种不同的处理方式。有些人会称其为“丰富”,“表现力”或“力量”,但您的里程可能会有所不同。在许多现实世界的项目中,您将不得不人为地限制要使用的语言功能以及不使用的语言功能,以便所有参与其中的开发人员都可以说相同的语言子集。

对于函数式编程,我更喜欢Clojure,它比Scala更简单。

让圣战开始;-)


2
如果只有丰富的希基关心尽可能多有关.NET像他那样了解JVM ...
工作

如果您多解释一些您觉得太复杂的事情,将会很有帮助。
理查·沃伯顿

4
@Richard Warburton:Scala的复杂性问题(或者,如Martin Odersky所说,“ Scala的强度和问题:它的可扩展性”)已经在许多论坛中广泛讨论。这样的讨论在这里。我并不是说复杂== 本身很糟糕。问题是,尽管最聪明的1%的程序员可以使用Scala 创造奇迹,但绝大多数人根本不会“获得它”,这现实使用中的问题。这就像一辆一级方程式赛车:绝大多数人根本无法驾驶这种野兽。
Joonas Pulakka 2010年

2
+1提到Clojure是有效的替代方法(涉及功能编程)。
奥利弗·韦勒

Clojure很棒,但是和Scala一样出色吗?没有所有这些静态类型,重构是否一样容易?(例如,重构Python相当困难-我确实为它编写了重构。)
9000

13

大约一年前,随着我对继续使用Java的创业公司产品的未来越来越沮丧,我决定尝试Scala。当时我已经在使用JavaScript和Python进行编程,Ruby也是一个不错的选择,但是我正在寻找一种静态类型的语言,最好是一种可以在JVM上运行的语言。

我确实真的很喜欢Scala,但确实如此,但是我发现它的代码非常丑陋且难以理解。我非常想知道,如果Scala是我们对Java的最佳解决方案,那么我肯定会被拧死并被判处继续使用我不喜欢的语言工作……

幸运的是,不久之后,我发现了Fantom。哦,我喜欢它!对我来说,这就像美国人对德国官僚机构的出色回答!它符合我在Scala中寻找的要求,但更加优雅。它具有VimEclipseNetbeans集成,一个不错的Web框架,与之一起运行的成熟产品,一个很小但非常有用的社区 ...动态和静态输入!我很高兴!

(我可以继续,但是这篇文章的目的是关于Scala,而不是Fantom,所以我在这里停止。我的偏好很明确,尽管这篇文章将两者进行了比较。我永远无法理解为什么与Scala相比,Fantom很少受到关注。但是,如果您一直收听此播客[ mp3 ] ,那么显然我并不是唯一的一个。)


9

2年前,当我最初涉足Scala时,它看起来有些陌生,对我来说很吓人。在某种程度上,我发现核心语言实际上比Java简单得多,但是它的语法和语义非常灵活,即使没有宏功能,您也可以创建类似它的新语言结构。从那以后,我已经将所有Java项目完全切换到Scala,因为它使我无需编写太多样板代码即可编写代码。

我喜欢Clojure,但是在某些情况下,平台需要您将其编译为静态字节码(Android,applet等),而在Scala中您可以做到这一点。

Scala使您可以通过功能方式解决许多问题,但是我经常发现使用类感觉更自然的问题。这使事情变得更加复杂,但是远远没有C ++的复杂性和痛苦。

当我真正开始学习该语言时,对我来说最大的收获是,我可以像在Java中一样编程,而不会产生噪音(有点像启动Groovy时的情况),但最终您想尝试更深入地研究它的功能语言-它与您一同成长。

关于IDE的问题:将Emacs用于所有功能后,我所有的IDE问题都消失了:-)


9

我喜欢Scala的原因很多,但是有一个经常被忽略的原因:它的简单性。

Scala可能不像Oberon那样简单,但是它比其他一些语言要简单得多。Scala语言规范为〜160页,Java语言规范为〜600页(仅是语言,而不是JVM或库!),ECMA-334 C#语言规范(AFAIK对应于Visual C#2.0的子集)为约440页(其中不包含LINQ查询理解,lambda表达式,扩展方法,通用协和和dynamic,自变量,具有默认值的可选参数,关键字参数var)。甚至ECMAScript 5.1的当前草案也更大,约为210页。当然还有我自己的“默认”语言Ruby,其当前的ISO Draft大约有310页,仅指定Ruby 1.8.6、1.9.1和1.9.2交集的几乎很小的子集。


6
语言规范中的页数是衡量其复杂性的一种有趣方法。Scala如何对此发表意见是令人惊讶的。没有人会说Python很复杂,或者C ++很简单,但是Scala似乎都是:-)例如scala-lang.org/node/7431
Joonas Pulakka 2010年

您可以使用该语言来构建复杂的事物,有些看起来就像是该语言-具有非数字名称的方法,例如,看起来像运算符重载,而不是。
用户未知,

2
语言规范中的页数是比较两种语言复杂性的一种好方法。仅举两个例子:Java规范以几乎教程的方式编写,而Scala规范以非常简洁的方式编写。再举一个例子,C#2.0实际上实际上和今天的Java一样复杂,或者考虑到“不安全”的机制,委托和特性,可能会稍微复杂一些。但是请注意,C#2.0规范小于JLS。
James Iry

1
现在,马丁·奥德斯基(Martin Odersky)比较了这些语言的形式语法的大小。这是对复杂性的一个方面的合理衡量。但这是唯一合理的,因为语法不如英语灵活。即使那样,您也必须小心。正如普通的程序,你可以很容易地拉伸或收缩有关如何将它们布置不同的选择语法,有多少不同的作品包括,什么基本字符类的假设,等等
詹姆斯IRY

3
等待..什么?您为什么要尝试根据规格大小来衡量复杂性?这是一个可怕的想法。
smartnut007

9

这是Scala的缺点:

  • 首先,空指针是一个非常糟糕的主意。霍阿雷称这是他的“十亿美元的错误”,但斯卡拉的情况更糟。它具有名为null,Null,None和Nil的对象。null是与Java的互操作性。Null是W3C DOM规范中的空指针,None是应替换为null的内容,Nil是空的东西。

  • 当语言结构变得笨拙时,通常应该由程序员而不是语言来负责。但是,在Scala中,核心语言已经包含库类,其唯一记录的行为是“这是黑客”。不相信吗?在scaladoc中搜索scala.xml.Group。

  • 最后一点同样重要,Scala的文档记录很差。官方文档中几乎没有任何scala类附带示例代码。Scala比Java更难学习,并且需要计算机科学方面的深厚知识。

为了避免被误认为是Scala-hater,这是我喜欢的东西:

  • 我很少有例外。与Java交互时,我从未遇到过ClassCastException和很少的NullPointerExceptions。
  • 代码比Java更短,更简洁
  • 这是智力上的挑战。与之相比,Java感觉就像是婴儿语言。

10
null是Java的空指针,Null是它的“类型”。None是的一个可能的“状态” Option[T],具有一个或一个零元素的集合。Nil是一个空列表。虽然您想让它听起来令人恐惧,但事实并非如此。这些类型不能相互替换或互换,它们的行为与应有的行为完全相同。
SOC

9

Scala 复杂。没办法!它的语法非常灵活,可以通过多种方式进行自定义(所有运算符/中缀表示法之上)-类型系统比我所知道的任何其他语言具有更多不同的功能。

因此事情并不像Haskell那样直截了当:Typeclasss涵盖了所有内容。

当Scala尝试将函数式编程,OO,过程式编程和Java库以及自己的想法组合在一起时,我们最终得到了很多概念,这些概念似乎以某种方向“朝着同一方向”发展:

  • 隐含值
  • 隐式函数
  • 存在的
  • 通配符
  • 特质
  • 介面
  • 抽象类
  • 案例类
  • 结构类型
  • 通用约束
  • 查看范围
  • 匿名类型

起初在它们之间进行选择似乎很困难,并且人们可能会很容易怀疑自己是否找到了解决某些问题的正确方法。甚至可以通过滥用implicits 来制造骇人的东西。

但是有趣的是:Scala有效。有时很难理解为什么(尤其是通过隐式转换+继承+ ...一些对象具有功能X),但是您不必在大多数时候都去担心。

尽可能简单地编写Scala,它将起作用。不要对一切可能的事物感到困惑,而要使用所需的东西。而且,如果您需要某些东西,您可以肯定Scala拥有它;)

而且,您获得的越好,就越能够使用运算符,隐式,单子,时髦的语法自定义Scala,最终获得接近DSL的东西,可以完美解决您的问题。

毕竟,您始终可以将Scala用作具有更好,更简单的语法,类型推断和某些功能的更好的Java。


1
“高于所有运算符/中缀符号”-只是scala缺少运算符。:)这只是方法。
用户未知,

6

这是一种出色的语言,在许多方面都比Java简单。

出于与大多数人(无论是否为程序员)不喜欢学习新的编程语言相同的原因,大多数人都不喜欢它(无论是Java程序员还是不喜欢Java程序员)。我怀疑大多数学习编程语言的人甚至都不喜欢学习那种语言。

如果您担心一种语言像C ++一样复杂,我会避免像瘟疫一样使用Clojure。对于完全不了解一种或两种语言的人们,Scala比Clojure更复杂的抱怨已成为后备争论。

Clojure具有宏,这意味着您可以根据需要随意更改语言的语法,不仅为您提供“无数种不同的处理方式”,而且还为您提供了几乎无限多种处理方式。程序员使用宏创建的所有新语法都不会在语言规范的任何地方记录。

您说:“但是我们可以避免使用宏或规范代码中允许使用的宏”。恭喜,您现在必须“人为限制要使用的语言功能,而不要使用哪些语言”,这正是使用Scala的Clojure的胡言乱语的白痴作为避免开始使用Scala的原因。


6
感谢您对Scala vs Clojure的意见,但这是我真正询问的OP吗?
Martin Wickman 2010年

有趣的地方:宏。也有点担心。Scala中是否提供了宏或类似内容,还是整个“人为限制”的事情都使人分心?
Armand 2010年

1
这似乎是对我的回答的评论,而不是对原始问题的回答。我同意,宏为您提供无限的力量,因此,如果使用不当,它们会很烂。因此,您应该正确使用它们(仅在需要时使用)。这并不会改变Clojure语言是最简单的语言之一的事实。Scala肯定不是。
Joonas Pulakka 2010年

>这并不会改变Clojure语言是最简单的语言之一的事实。<这也是完全错误的,除非您使用的是“语言构造数量”这样的指标。如果您使用的是有用的东西,例如用该语言读写程序有多么容易,那么Clojure并不是最简单的之一。
乔什2010年

因此,请继续给我们提供一个良好的语言复杂度指标。“用该语言读写程序有多么容易” 完全主观的,因此在这里并没有真正的帮助。诚然,想出一个有用的客观的度量可以几乎是不可能的。(例如,下面的JörgW Mittag使用语言规范中的页面数作为一种复杂性度量。虽然客观,但我不确定它是否很有用。)
Joonas Pulakka 2010年

4

我真的很喜欢Scala库的更细粒度的类型。新馆藏图书馆似乎经过深思熟虑。我还喜欢它如何减少简单类所需的代码量以及它添加的功能概念。其类型推断也非常有帮助。感觉就像没有训练轮的Java。在使用C#一段时间之后,Scala实际上感觉像是竞争对手,而Java仍然有用,但被抛在了后面。


2

作为一名Java程序员,我最初发现Scala很有趣。但是,在尝试了一段时间之后(几乎遇到了其他人已经列出的所有正面/负面信息),我对它感到非常“ meh”。工具集可用性的降低抵消了语言的改进。我只是无法提出任何明确的理由来进行切换。很好,但还不足以为切换做充分的准备。也没有那种主观的兴奋因素(就像Clojure看起来那样)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.