4

私は Scala の初心者ですが、Java のバックグラウンドがあります。

Scala コードを記述する場合、次のようなスタイルで Option パラメータを処理すると便利です。

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

s => s.sizeしかし、私が知っているように、それぞれが新しいFunction1[A, B]. たとえば、このような変換を 8 回行うと、8 つのクラスが追加されます。フォームをバインドするとき、私はそのようなスニペットを非常に頻繁に使用するので、問題は次のとおりです。

あまり使用しないで、if 表記に置き換える必要がありますか、それともそのようなクラスフラッドは 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))

それは2つの異なるFunction1[String, String]クラスを生成しますか? そのような変換が何百もある場合はどうなりますか?

4

1 に答える 1

9

Android 向けに開発している場合は、おそらく Dalvik を使用してコードを実行することになりますが、これには迷惑な 64k メソッドの制限があります (ただし、これを回避する方法はあります)。各クラスにはいくつかのメソッド (コンストラクターと適用) が必要なため、これが問題になる可能性があります。

それ以外の場合、Sun/Oracle JVM のクラスは PermGen スペースに入ります。本当に必要な場合は、JVM を起動するときに調整できます。それは本当に問題ではありません。はい、おそらく数万のクラスがたくさんありますが、JVMはそれをうまく処理できます(少なくとも、何が期待できるかについて頭を上げて喜んでいるなら)。異常な制約に遭遇する可能性が非常に高いことがわかっていない限り、これはそれほど心配する必要はありません。

多くの場合、これらすべての関数を作成するとパフォーマンスが低下するのではないかと心配するかもしれません。これは、Scala コンパイラーが原則的に修正できるものであり、常に賢くなっています。したがって、慣用的な方法でコードを記述し、それが現在大きなパフォーマンスの問題でない限り、コンパイラがあなたを助けてくれることを願っています. そうなる可能性は十分にあり、「正しい」方法で記述し、必要に応じてパフォーマンスのためにリファクタリングする方が、万が一の場合に備えてより厄介な構造を使用するポリシーを採用するよりも簡単であることがわかる可能性はさらに高くなります。問題になる。もちろん、事前にわかっているところでは確実にボトルネックになるところもありますが、

于 2012-12-17T18:22:16.623 に答える