2012-12-17 23 views
3

我是一名Scala新手,但拥有一些Java背景。斯卡拉。太多的小功能,太多的课程?

当写Scala代码是非常有用的应对这种样式选项参数:

val text = Option("Text") 
val length = text.map(s => s.size) 

但每个s => s.size我所知带来了新的Function1[A, B]。如果我举例8这样的转换,它会带来8个额外的类。在绑定表单时,我使用了这样的代码片段,所以问题是:

我应该少用它,或者用if符号替代它,或者这样的class-flood对JVM不重要,或者可能Scala编译器有一些魔力?

更新:一个也许更具体的例子是:

case class Form(name: Option[String], surname: Option[String]) 
val bindedForm = Form(Option("John"), Option("Smith")) 
val person = new Person 
bindedForm.name.foreach(a => person.setName(a)) 
bindedForm.surname.foreach(a => person.setSurname(a)) 

它会产生两个不同的Function1[String, String]类?如果有数百个这样的转换会怎么样?

+1

我们过去在做J2ME应用程序时关心类的数量。今天关心这个没有意义。 –

回答

8

如果您正在为Android开发,那么您可能要使用Dalvik来运行代码,该代码具有恼人的64k方法限制(尽管存在are ways around it)。由于每个类需要几个方法(构造函数和应用),这可能是一个问题。

否则,Sun/Oracle JVM上的类会进入PermGen空间,如果您真的需要,可以在启动JVM时调整这些空间。这真的没关系。是的,你会有很多类,也许有成千上万的类,但是JVM可以很好地处理它(至少如果你愿意提供一些关于期望的东西的话)。除非你知道你很可能遇到一些不寻常的限制,否则这不是你应该担心的事情。

更常见的情况是,人们可能会担心创建所有这些功能会导致性能损失 - 但是如果您现在没有真正遇到这种损失,请不要担心;这是Scala编译器原则上可以修复的问题,并且它一直都变得更加聪明。所以,只需编写代码的惯用方式,除非它现在是一个很大的性能问题,只希望编译器能够为您节省。它有一个相当好的机会,而且更有可能你会发现,将它写成“正确”的方式更容易,然后在需要时重构性能,而不是采用使用更笨拙构造的策略,以防万一有可能成为一个问题。当然,有些地方你可能事先知道肯定会成为一个瓶颈,就像在一个选项中包含你从一个大文件中读取的每个字节一样,但是除了这样的明显的东西之外,你最好是反应性地而不是主动避免关闭。

+0

而随着java8的permgen被删除。所以它只是进入堆。 – jilen