空飛ぶ羊

勉強したり登壇したり勉強会参加したり

学習メモ: クラス (1/2) #dwango #Scala

この記事について

ドワンゴScala研修テキストを学習したときのメモです。 okoysm.hatenablog.jp

DOING

クラス

クラス定義

  • 記述方法以外はJavaと同じ (パラメータの指定方法くらい?)
class ClassName(parameter1: Type1, parameter2: Type2, ...) {
  (a field or method definition)の0回以上の繰り返し
}

例)点を表すクラスを定義する場合

class Point(_x: Int, _y: Int) {
  val x = _x
  val y = _y
}

コンストラクタの引数をそのまま公開したい場合は以下のように短く書ける

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

疑問点

使うからクラスを定義するんだろうし、そのまま公開するケースのほうが多い気がしたのだけどどうなのだろう?

ポイント

この書き方のポイントは大きく2点。

  • クラス名の直後にコンストラクタの定義がある
    • Scalaでは1クラスに付き、基本的には1つのコンストラクタしか使わない
    • 文法上は複数のコンストラクタを定義できるようになっていますが、実際に使うことはまずないので覚える必要はない
    • 最初の1つのコンストラクタをプライマリコンストラクタとして特別に扱っている
  • val/varによって、コンストラクタ引数をフィールドとして公開することができる
    • プライマリコンストラクタの引数にval/varをつけるとそのフィールドは公開され、外部からアクセスできるようになる
    • コンストラクタ引数のスコープはクラス定義全体におよびます。

これを使うと、メソッド定義の中から直接コンストラクタ引数を参照できる。
このプログラムの場合+メソッド定義の中から直接コンストラクタ引数を参照している

class Point(val x: Int, val y: Int) {
  def +(p: Point): Point = {
    new Point(x + p.x, y + p.y)
  }
  override def toString(): String = "(" + x + ", " + y + ")"
}

この章での疑問点

  • コンストラクタの引数をそのまま公開したくない場合などあるのだろうか(Javaでいうprivateな変数にしてgetter/setterで取らせたいみたいなやつかな)

進捗

DONE

DOING

  • クラス

TODO

  • オブジェクト
  • トレイト
  • 型パラメータと変位指定
  • 関数
  • Scalaのコレクションライブラリ
  • ケースクラスとパターンマッチング
  • エラー処理
  • Implicit
  • 型クラスの紹介
  • FutureとPromise
  • テスト
  • Javaとの相互運用
  • S99の案内
  • トレイトの応用編:依存性の注入によるリファクタリング