SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

今からでも遅くない これから始めるScala

今からでも遅くない これから始めるScala(後編)

進化したオブジェクト指向


  • X ポスト
  • このエントリーをはてなブックマークに追加

クラスとオブジェクト

 クラスについてのおさらいが終わったところで、Scalaがサポートするさまざまなオブジェクト指向サポートについて解説します。

複数のコンストラクタ

 クラスを定義する際に、クラスの宣言と同時にコンストラクタ引数を指定するのがScalaの構文です。では、コンストラクタが複数あるクラスを定義するには、どのようにするのでしょうか? 以下の定義をご覧ください。

リスト4 複数のコンストラクタを持つクラスの例
import java.util.Date
import java.net.URL
// ブックマークを表すクラス。
// 基本コンストラクタは3つの引数をとる
class Bookmark( val title:String, val url:URL, date:Date ) {
  // urlを文字列でとる補助コンストラクタ
  def this( title:String, url:String, date:Date ) = this( title, new URL( url ), date )
  // urlを文字列でとり、dateを省略した補助コンストラクタ
  def this( title:String, url:String ) = this( title, new URL( url ), new Date )
}

 このBookmarkクラスは、コンストラクタで3つの引数(title, url, date)をとるように定義されていますが、クラス内部に"def this( title:String, url:String, date:Date ) "のようにthisで定義されたメソッドを持っています。

 このように、thisで定義されたメソッドは補助コンストラクタと呼ばれており、異なる引数をとるコンストラクタとして定義できます。クラス定義と同時に指定されているコンストラクタは基本コンストラクタと言います。

 補助コンストラクタには、いくつかの制限があります。

  • 補助コンストラクタは最初の処理で同じクラス内の、先に定義された他のコンストラクタを呼び出さなければならない
  • 補助コンストラクタは、最終的に基本コンストラクタが呼び出されるようになっていなければならない

 このように、Scalaでの複数のコンストラクタを定義する際の制限は、Javaより厳しくなっています。ただ、一般的にインスタンス化の方法が複数あるクラスを定義する場合は、補助コンストラクタよりこのあとに説明するコンパニオンオブジェクトにファクトリーメソッドを定義する場合が多いのです。

シングルトンオブジェクト

 Scalaでは、objectキーワードによりシングルトンオブジェクトを定義できます。シングルトンオブジェクトとは、あるクラスのインスタンスがプログラムの中でただ一つしか存在しないオブジェクトです。Javaなどでシングルトンオブジェクトを定義する場合は、インスタンスが重複して生成されないように制御する必要がありますが、Scalaではclassキーワードのかわりにobjectキーワードを用いることでシングルトンオブジェクトを簡単に定義できます。

リスト5 シングルトンオブジェクトの例
// ブックマークのデータを保持するシングルトンオブジェクト
object MyBookmarks {
  // 内部でブックマークを保持するために変更可能なArrayBufferを利用する
  import scala.collection.mutable.ArrayBuffer
  // ブックマークを保持するArrayBuffer
  private val bookmarks = ArrayBuffer.empty[Bookmark]

  // ブックマークを追加
  def add( bookmark:Bookmark ) = bookmarks += bookmark

  // ブックマークを表示
  def show = bookmarks.foreach{ b => println( "%s : %s" format( b.title,b.url )) }
}

 リスト5の例は、MyBookmarksというシングルトンオブジェクトです。このオブジェクトはプログラム中で一つしかインスタンスが存在しません。代わりに、シングルトンオブジェクトはコンストラクタを定義できないようになっています。

 objectキーワードで定義されたシングルトンオブジェクトは、通常のクラスと同様に内部にメンバーを持つことができます。MyBookmarksオブジェクトは、内部にprivateでブックマークのデータを持つprivateなbookmarksフィールドや、add/showなどのpublicメソッドを持っています。

リスト6 シングルトンオブジェクトを利用する
scala> MyBookmarks.add( new Bookmark("今から始めるScala 前編" ,"http://codezine.jp/article/detail/5193/") )
res1: scala.collection.mutable.ArrayBuffer[Bookmark] = ArrayBuffer(Bookmark@feb5de5)

scala> MyBookmarks.show
今から始めるScala 前編 : http://codezine.jp/article/detail/5193/

 このように、インスタンス化せずにオブジェクト名を利用することでシングルトンオブジェクトにアクセスできます。

 また、シングルトンオブジェクトは他のクラスを継承することが可能です。

次のページ
コンパニオンとstatic

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
今からでも遅くない これから始めるScala連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 尾崎 智仁(オザキ トモヒト)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5329 2010/08/08 00:57

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング