2010-12-08 2 views
3

可能性の重複:Scalaのオブジェクト

class Foo { 
    object timestamp extends java.util.Date 
} 

class Foo { 
    val timestamp = new java.util.Date {} 
} 
0123:

val and object inside a scala class?

間の実質的な違いがあります

オブジェクトフィールドを持つクラスを実際にはどういう意味ですか?彼らは何のために使われていますか?オブジェクトを使用する必要がある状況はありますか?

ありがとう...

+1

可能性のある複製http://stackoverflow.com/questions/3448691/val-and-object-inside-a-scala-class –

答えて

6

フィールドに動作を追加する必要がある場合は、objectを使用することをお勧めします。例えば:

class Foo { 
    object startDate extends java.util.Date { 
     def isBusinessDay: Boolean = // ... 
    } 
} 

class Bar { 
    lazy val startDate = new java.util.Date { 
     def isBusinessDay: Boolean = // ... 
    } 
} 

foo.startDateのタイプfoo.startDate.typeであり、そしてfoo.startDate.isBusinessDayメソッドの呼び出しは、静的に解決されます。

bar.startDateのタイプは、構造タイプjava.util.Date{ def isBusinessDay: Boolean }です。したがって、bar.startDate.isBusinessDayの呼び出しはリフレクションを使用し、不要なランタイムオーバーヘッドを招きます。

+0

複数の質問をしている私には恥ずかしいです。今は2つの正解がありますが、私は1つしか選択できません。 :( –

2

これらは基本的に同じように動作します。私はclass X { object Y ... }が単にX.Yの名前空間を提供すると仮定していました。具体的にはXに関連する(定数)ユーティリティーデータを格納するのにYを使用しました。実際には、メモリプロファイリングを行うときに発見した新しいXごとに1つの新しいオブジェクトが作成されました。

5

2つの違い、重要なもの、微妙なものがあります。まず、オブジェクトが遅延開始されます。あなたの目的のために、これは、あなたの2番目の例が同等に動作するように、

class Foo { 
    lazy val timestamp = new java.util.Date {} 
} 

でなければならないことを意味します。微妙に、各オブジェクトには独自の固有の型があります。例の場合、timestampのタイプはFoo.timestamp.typeです。これは通常は実際には重要ではありませんが、オブジェクトに反射的にアクセスする場合は驚きを引き起こす可能性があります。

+0

ちょっと拾いましたが、いずれのインスタンスでもタイムスタンプにはありませんユニークな型ですが、オブジェクトの場合、型は予測可能であり、valの場合、それは何らかの型ですか? –

+0

他の答えを見ると、オブジェクトフィールドがレイジーヴァルよりも前のコードから来ているようです。私は怠惰なヴァルがほとんど常に好まれていると思います。 –

+0

@Eric実際には、型も 'val'の場合に予測可能ですが、構造型です。私の答えにもっと... –

関連する問題