気になりつつも放置状態だったScalaをGWを利用して勉強しているんだけど,
ちょっと,気になったのでスコープの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] |
スコープ | 概要 |
---|---|
protected | 自分より内部のメンバと継承したクラスの メンバのみアクセス可能 Javaのprotected-(default access) |
private | 自分より内部のメンバのみアクセス可能 |
private[this] | オブジェクトスコープ |
う~ん,なんか微妙に違っているんだね.
結局,まったく同じなのはTopレベルクラスの private だけ.
あと,同じ意味のスコープとして public があるって感じ.
Scalaは protected は単純に継承したクラスまで,
private は自分の内部というのを厳密にした感じ.
パッケージやエンクロージングクラスに対する制御は [] で指示する.
Javaのはちょっと妥協の産物的なところやパッケージの使い方が
当初あまり良く分かっていなかったと言うのもあって微妙なんだけど,
Scalaはその点を改善しているって感じかな.
Javaのパッケージは名前空間の意味合いが強いんだけど,
使われていくうちにスコープとしての意味合いが必要だと
分かってきたんだよね.
例えば,最近だと良くやるのがあるパッケージに対して
インタフェースのみを定義して,そのサブパッケージ(implとか)で
その実装クラスを定義するって感じとか.
この辺はJava2あたりでネストクラス,内部クラスが追加され,
その際にパッケージとエンクロージングクラスで違ってしまったんだよね.
まあ,Javaは下位互換,特にVM互換が必要だった所為もあるんだけど.
一応,JSRでサブパッケージの概念を取り入れようとしているのとかも
あるみたいだけど,互換性を考えると微妙なところかな.
折衷案的なものとしては,OSGiみたいにJARファイルのマニフェストで
公開パッケージを指定するっていうのもあるけどね.