S-JIS[2010-10-23/2011-09-18] 変更履歴

Scalaパッケージ

Scalaのパッケージのメモ。


package文

自分のクラスをパッケージに所属させる為にpackage文を使用する。
(→Javaのpackage文

Scala Java 備考
package foo.bar

class Hoge { }
package foo.bar;

class Hoge { }
foo.bar.Hogeクラスが定義される。
package foo {
  package bar {
    class Hoge { }
  }
}
  Scalaのpackageでは、波括弧「{}」でくくって適用範囲を明確にすることが出来る。
foo.bar.Hogeクラスが定義される。
package foo {
  package bar {
    class Hoge { }
  }
  package zzz {
    class Fuga { }
  }
}
  したがって、異なるパッケージのクラスを一つのソースファイル内に混在させることが出来る。
foo.bar.Hogeクラスと
foo.zzz.Fugaクラスが定義される。
package foo.bar

class Hoge { }

package sub {
  class Sub { }
}
  foo.bar.Hogeクラスと
foo.bar.sub.Subクラスが定義される。
package foo
package bar

class Hoge { }
  foo.bar.Hogeクラスが定義される。
(Scala2.8以降らしい)

import文

他パッケージのクラスを、完全修飾することなく単純なクラス名のみで記述できるようにする。
(→Javaのimpot文

Scala Java 備考
import java.util.Date
import java.util.Date;
一つのクラスだけをインポートする。
import java.util.Date, java.util.Calendar
  カンマで区切ることによって1行で複数のインポートを書ける。[2011-01-09]
import java.util._
import java.util.*;
Scalaでは、ワイルドカードは「_」で表す。
import java.util.{ List, Map }
import java.util.List;
import java.util.Map;
Scalaでは、同一パッケージ内の複数のクラスをまとめて一行で指定できる。
import java.util.{ Map => JavaMap }
import java.util.{ List => JavaList, Map => JavaMap }
  クラスを別の名前でインポートする。
import java.util.{ Date => _, _ }
  別名を「_」にすると、そのクラスはインポートされなくなる。
別途「_」だけ指定すると、それ以外のクラスは全てインポートされる。
左記の例では、Date以外のjava.utilのクラスが全てインポートされる。
import java.lang.System.currentTimeMillis
import java.lang.System._
import static java.lang.System.currentTimeMillis;
import static java.lang.System.*;
メソッドをインポートする。
Javaのstaticインポートは、Scalaではstatic無しで指定する。
import runtime.RichInt
  Scalaでは、現在のパッケージからの相対指定が出来る。[2011-01-15]
現在のパッケージが「scala」のとき、
import runtime.RichInt」は
import scala.runtime.RichInt」と同じ。
import java.io
import io.IOException
  インポートしたオブジェクト(パッケージ名の一部もオブジェクトとして認識される)からの相対指定が出来る。[2011-01-18]
import _root_.scala.runtime.RichInt
  Scalaでは現在のパッケージからの相対指定が出来るが、
明示的に絶対指定(先頭からの指定)をするときには「_root_」から始める。[2011-01-09]

Javaの場合、import文はソースファイルの先頭に書く必要がある(先頭にしか書けない)が、
Scalaでは、ブロックの中に記述して、そのスコープ内に限定することが出来る。

例:

def nowString() = {
  import java.util.Date
  new Date().toString()
}
scala> nowString()
res9: java.lang.String = Sun Oct 24 03:06:29 JST 2010

暗黙にimportされているパッケージ・クラス

Scalaでは、以下のパッケージ・クラスが暗黙に(自動的に)インポートされている。

名前 用途 備考
scala._ Scalaの基本クラス  
scala.Predef._ 暗黙に使用できる関数が定義されているシングルトンオブジェクト Javaのstaticインポートに相当する方式でインポートされる。
Predefに定義されているメソッドを関数として(オブジェクト名の指定なしで)使えるようになる。
java.lang._ Javaの基本クラス  

アクセス制御

Scalaのアクセス修飾子の細かい部分はパッケージと関連している。[2010-12-19]
(→Javaのアクセス制御

  public protected
[パッケージ]
private
[パッケージ]
protected protected
[this]
private private
[this]
自インスタンス
自クラス(別インスタンス) × ×
サブクラス(別パッケージ) × × ×
無関係クラス(指定パッケージ) × × × ×
無関係クラス(別パッケージ) × × × × × ×
package sample {
  package pack1 {

    // 自クラス
    class A1 {
                       val a1pub  = 11
      protected        val a1pro  = 12
      private          val a1pri  = 13
      protected[this]  val a1prot = 14
      private[this]    val a1prit = 15
      protected[pack1] val a1pro1 = 16
      private[pack1]   val a1pri1 = 17

      def aaa() = {
        // 自クラス・別インスタンス
        val a1 = new A1()
        a1.a1pub
        a1.a1pro
        a1.a1pri
//x     a1.a1prot
//x     a1.a1prit
        a1.a1pro1
        a1.a1pri1
      }
    }

    // 無関係クラス・指定パッケージ
    class B1 {
      def bbb() = {
        val a1 = new A1()
        a1.a1pub
//x     a1.a1pro
//x     a1.a1pri
//x     a1.a1prot
//x     a1.a1prit
        a1.a1pro1
        a1.a1pri1
      }
    }
  }

  // 別パッケージ
  package pack2 {

    // サブクラス
    class A2 extends pack1.A1 {
      def a2() = {
        a1pub
        a1pro
//x     a1pri
        a1prot
//x     a1prit
        a1pro1
//x     a1pri1
      }
    }

    // 無関係クラス・別パッケージ
    class C2 {
      def ccc() = {
        val a1 = new pack1.A1()
        a1.a1pub
//x     a1.a1pro
//x     a1.a1pri
//x     a1.a1prot
//x     a1.a1prit
//x     a1.a1pro1
//x     a1.a1pri1
      }
    }
  }
}

なお、この例で「private[sample]」「protected[sample]」とすると、sampleパッケージ直下と、sample.pack2(sample配下のパッケージ)もアクセス可能な範囲になる。


Scala目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま