RubyとJava

RubyJavaで、public,private,protectedの意味が微妙に違ってて混乱する。なにか違和感があると思ったら、Rubyにはインスタンス変数へのアクセス修飾子がそもそも存在しなくて、他のインスタンスからは直接参照できないからか。対して、javaインスタンス変数にprivateを指定しても同一クラスから作られたインスタンスなら参照できる。

class H
  def initialize(foo)
    @foo = foo
  end

  def huga(h2)
    h2.foo # 同じクラスのインスタンスを渡してもエラー
  end
end
class Hoge {
  private int foo;
  Hoge(int foo) {this.foo = foo}
  int huga(Hoge h) {return h.foo; /* できちゃう! */}
}

eclipseが補完してくれなかったら気づかなかったと思う。

というわけで、最近はjavaに首ったけなのです。上記みたいな不満はありますが、基本的にはいい言語だと思います。

その他不満点

  • 組み込み型がオブジェクトじゃない
  • getとかsetとか命名規則が煩わしい。(引数0のメソッドも括弧が必要なので仮想属性にできない)
  • for(int i=0;i<=MAX;i++){...}みたいな古くさーいfor文を書かないといけない。pythonでいうrange()さえあれば拡張for文だけで済ませられるのに…。
  • 参照とか破壊的代入とか意識しないといけない*1

*1:javaに限らず手続き型言語の宿命だけど。