8

私はScalaを始めています。引数をプロパティとして公開したい場合、クラスをケースクラスとして定義する必要があることを正しく理解していますか? 副作用はありませんか?

4

4 に答える 4

14

ケースクラス用に生成されたボイラープレートコードは、バイトコードでわずかですがゼロではないコストを伴います。copyメソッドに加えて、hashCode、 、equalsおよびtoStringコンパニオン オブジェクト ファクトリ メソッドがあります。

さらに重要なのは、ケース クラスからクラスを派生させることはお勧めできないという事実です。ケース・クラスからケース・クラスを派生させると、実際に問題が発生します (そして、コンパイラーは怒鳴りつけます)。特に、オーバーライドcopy(...)メソッドはコンパイラによって生成されないため、ケース クラスから派生したケース クラスをコピーしようとすると、奇妙なエラー モードが発生する可能性があります。

ケースクラスを継承グラフのリーフに置いておけば、問題ありません。

于 2010-08-31T03:40:04.187 に答える
12

定義されたすべてのパラメーターのプロパティを取得し、それらは vals (つまり、最終値) になります。

case class User(name: String, group: String)
val user = User("jsmith", "admins")

// access both properties
println("name: %s group: %s".format(user.name, user.group))

この動作は、通常の (つまり、非ケース クラス) でも取得できます。

// creates two final public properties as well
class User(val name: String, val group: String)

// creates read/write public properties
class User(var name: String, var group: String)
val user = new User("jsmith", "admins")
user.group = "guests"

Case クラスは、equality、hashcode、toString の便利な実装や、とりわけ new を使用する必要をなくすファクトリ メソッドを備えたコンパニオン オブジェクトなど、他にも多くのものをもたらします。

ご覧のように、ケース クラスは目的を達成するために必須ではありませんが、すぐに達成できます。副作用に関しては、ケース クラスを定義すると、前の段落で説明した内容を提供するために、舞台裏でいくつかのコードが生成されます。これらは便利なことが多く、あまり気にしませんが、知っておくと便利です。

于 2010-08-31T03:04:21.173 に答える
7

すでに述べた点に加えて、ケース クラスは、Java で「値クラス」と呼ばれるものに概念的に近いものです。もちろん、変更可能なケース クラスや、機能は多いがデータが少ないケース クラスを作成することを妨げるものは何もありませんが、これは、あなたのコードを操作している他の人を驚かせる可能性があります。経験則として、ケースクラスを作成する前に少なくともよく考えてください...

  • 可変状態が必要
  • 後でサブクラスが必要になるかどうかわからない場合
  • それらの主な目的が物事を計算することであり (物事を表現することではない)、これらの計算が複雑である場合
  • それらの動作をきめ細かく制御する必要がある場合 (たとえば、カスタム パターン マッチングが必要な場合)
  • パフォーマンスが本当に重要な場合
  • 「ケースクラス機能」の1つだけが必要な場合、たとえば、コンストラクター引数の前に「val」と入力するのをやり過ぎないようにするために、ケースクラスの使用を検討します
于 2010-08-31T06:24:08.210 に答える
4

他の答えはすべて問題ありませんが、ケース クラスに値の等価性があり、標準的なオブジェクト指向の同一性等価性とは非常に異なる動作をするという、1 つの実際のリスクが見逃されています。2 つのケース オブジェクトは、すべてのフィールドが等しい場合に等しくなります。これは、場合によってはまさに必要なことですが、他の場合には非常に予想外です。特に、値が等しいものに変更可能な状態を追加すると、問題が発生します。ハッシュコードが時間とともに変化するオブジェクトを簡単に見つけることができ、その結果、HashMap が破損したり、その他の厄介な問題が発生したりします。

プロパティを「val」として宣言するキーストロークを節約するために何かをケースクラスとして宣言することは、偽りの経済であり、いつかあなたを噛むでしょう。

于 2010-08-31T12:04:19.267 に答える