【Scala】【Java】 スコープの比較 | さすらいびとの徒然漂流記

さすらいびとの徒然漂流記

ふらふら漂流するさすらいびとのように,色々な話題についてお気楽極楽,徒然なるままに…

気になりつつも放置状態だったScalaをGWを利用して勉強しているんだけど,

ちょっと,気になったのでスコープのJavaとの違いをちょっとまとめてみた.



Javaとの比較
Java Scala
Top public なし
protected protected[package name]
なし private[package name]
private private

nested/

inner

public なし
protected protected[package name]
なし private[package name]
private private[enclosing class name]



Scala独自のもの
スコープ 概要
protected

自分より内部のメンバと継承したクラスの

メンバのみアクセス可能

Javaのprotected-(default access)

private 自分より内部のメンバのみアクセス可能
private[this] オブジェクトスコープ



う~ん,なんか微妙に違っているんだね.

結局,まったく同じなのはTopレベルクラスの private だけ.

あと,同じ意味のスコープとして public があるって感じ.


Scalaは protected は単純に継承したクラスまで,

private は自分の内部というのを厳密にした感じ.

パッケージやエンクロージングクラスに対する制御は [] で指示する.


Javaのはちょっと妥協の産物的なところやパッケージの使い方が

当初あまり良く分かっていなかったと言うのもあって微妙なんだけど,

Scalaはその点を改善しているって感じかな.


Javaのパッケージは名前空間の意味合いが強いんだけど,

使われていくうちにスコープとしての意味合いが必要だと

分かってきたんだよね.

例えば,最近だと良くやるのがあるパッケージに対して

インタフェースのみを定義して,そのサブパッケージ(implとか)で

その実装クラスを定義するって感じとか.


この辺はJava2あたりでネストクラス,内部クラスが追加され,

その際にパッケージとエンクロージングクラスで違ってしまったんだよね.

まあ,Javaは下位互換,特にVM互換が必要だった所為もあるんだけど.


一応,JSRでサブパッケージの概念を取り入れようとしているのとかも

あるみたいだけど,互換性を考えると微妙なところかな.

折衷案的なものとしては,OSGiみたいにJARファイルのマニフェストで

公開パッケージを指定するっていうのもあるけどね.