S-JIS[2010-10-23/2011-09-18] 変更履歴
Scalaのパッケージのメモ。
|
||
自分のクラスをパッケージに所属させる為に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以降らしい) |
他パッケージのクラスを、完全修飾することなく単純なクラス名のみで記述できるようにする。
(→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
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配下のパッケージ)もアクセス可能な範囲になる。