[解決済み] Scalaのtraitでvalとdefの使い分けは?
質問
私は
効果的なscalaのスライド
を見ていたら、スライド 10 で、決して
val
の中で
trait
を使い、抽象的なメンバーには
def
を使用します。このスライドでは、なぜ抽象的な
val
の中で
trait
はアンチパターンです。抽象的なメソッドのためにtraitでvalとdefを使用することについてのベストプラクティスを説明できる人がいれば、私は感謝します。
どのように解決するのですか?
A
def
のどちらかで実装することができます。
def
, a
val
, a
lazy val
または
object
. つまり、これはメンバを定義する最も抽象的な形式なのです。traitsは通常抽象的なインタフェースなので、例えば
val
というのは
どのように
を述べているのです。もし、あなたが
val
を要求した場合、実装クラスは
def
.
A
val
は安定した識別子が必要な場合のみ、例えばパスに依存する型のために必要です。通常は必要ないものです。
比べてみてください。
trait Foo { def bar: Int }
object F1 extends Foo { def bar = util.Random.nextInt(33) } // ok
class F2(val bar: Int) extends Foo // ok
object F3 extends Foo {
lazy val bar = { // ok
Thread.sleep(5000) // really heavy number crunching
42
}
}
もし、あなたが
trait Foo { val bar: Int }
を定義することはできないでしょう。
F1
または
F3
.
OK、そしてあなたを混乱させ、@om-nom-nom-using abstractに答えるために
val
を使用すると、初期化の問題が発生する可能性があります。
trait Foo {
val bar: Int
val schoko = bar + bar
}
object Fail extends Foo {
val bar = 33
}
Fail.schoko // zero!!
これは醜い問題で、私の個人的な意見では、将来の Scala のバージョンではコンパイラで修正することで解消されるはずですが、そう、現在のところ、これは、抽象的な
val
s.
Edit
(2016年1月)を参照してください。抽象的な
val
宣言を
lazy val
を実装することで、初期化の失敗を防ぐこともできます。
関連
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み] Traitの代わりに抽象クラスを使用する利点は何ですか?
-
[解決済み】インプリメントとエクステンド。いつ使う?その違いは何ですか?
-
[解決済み】トレイトとインターフェイスの比較
-
[解決済み] RDDの内容を印刷するには?
-
[解決済み] Scalaのforループは下降か減少か?
-
[解決済み] scalaの列挙を理解する
-
[解決済み] Scalaです。リスト[Future]からFuture[List]への変換は、失敗したFutureを無視する。
-
[解決済み] Scalaの自動リソース管理にはどのようなものがありますか?
-
[解決済み] タイプダイナミックの仕組みと使い方を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SBTが終了せずに実行を停止する
-
[解決済み] scalaは推論される型の「許容される複雑さ」にどのような制限を設けているのでしょうか?
-
[解決済み] ジッパーがコモナドである理由を理解する
-
[解決済み] build.sbtとbuild.scalaの違いは何ですか?
-
[解決済み] Scalaにおけるval-mutableとvar-immutableの比較
-
[解決済み] 末尾再帰関数が最適化されるためのScalaアノテーションは何ですか?
-
[解決済み] Apache SparkでDataframeのカラム値をListとして抽出する。
-
[解決済み] Scalaでリストを2つのフィールドでソートするには?
-
[解決済み] Scalaでマップを反転させるエレガントな方法
-
[解決済み] タイプダイナミックの仕組みと使い方を教えてください。