2012-12-17 24 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