gotoshin

主に学んだ事の自分メモ用です。記事に書くまでも無いような事はhttps://scrapbox.io/study-diary/に書いてます。

Scala クラス & オブジェクト & トレイト

クラス

  • プライマリコンストラク

    • 構文上記述する事は可能だが、1クラスにつき1つのコンストラクタしか扱わない
  • 以下の様にコンストラクタの引数と同名のフィールドを定義し、その変数を外部に公開する事が可能

class Point(val x: Int, val y: Int)

メソッド定義

  • 返り値の型は読みやすさのために明記すべき

  • private

    • そのクラス内だけから
  • protected

    • 派生クラスからのみ
  • private[this]

    • 同じオブジェクトからのみ
  • private[パッケージ名]

    • 同じパッケージから
  • protected[パッケージ名]

    • 派生クラスに加えて同じパッケージに所属しているもの全て
  • 何もつけない

    • publicとなる
複数の引数リストを持つメソッド
  • add(x: Int)(y: Int)の様に記載する事が可能で、シンタックスシュガー書いたりimplicit parameterなるものや型推論の補助に使われる
    • 単に複数の引数を持つメソッドとしても定義可能
フィールド定義
  • アクセス修飾子の意味はメソッドと同様
  • private[this]をつけたフィールドへのアクセスは若干高速になる
抽象メンバー
  • メソッドやフィールドにおいて中身を持たせずに定義することができる
  • メソッドやフィールドの中身が無い以外は通常の定義方法と同じ

継承

  • Javaと同様にextendsで継承可能

オブジェクト

オブジェクトについて

  • Scalaでは全ての値がオブジェクトで、全てのメソッドは何らかのオブジェクトに属している
  • そのためJavaの様にstaticフィールドやstaticメソッドを作成する事が出来ない
  • 代わりにobjectキーワードによってシングルトンオブジェクトを作成し、ユーティリティメソッドやファクトリメソッドとして使用する

コンパニオンオブジェクト

クラスと同じファイル内、同じ名前で定義されたシングルトンオブジェクトは、コンパニオンオブジェクトと呼ばれます。コンパニオンオブジェクトは対応するクラスに対して特権的なアクセス権を持っています。

private[this](そのオブジェクト内からのみアクセス可能)なクラスのメンバーに対してはアクセス不可

トレイト

  • フィールドが持てるJavaのinterfaceの様なものと一旦は理解した
    • 複数のトレイトを1つのクラスやトレイトにミックスインできる
    • 直接インスタンス化できない
    • クラスパラメータ(コンストラクタの引数)を取ることができない