「本質」って便利な言葉だな

某所を読んでて思った.あと,javaを叩けばアクセスが集まるって,ポジティブなアクセスもネガティブなアクセスも同じ1アクセスだからねえ.

Javaに関して言えば基本的にはベターCなんだから,C/C++と比較してメモリ絡みの(今となっては)本質的ではない記述を大幅に書かなくて済むんだからそれでいいんじゃないかと思う.あと,速度を意識してコードをいじる必要が余りないとか(構造をざくっと変えずに出来るようなことはJITコンパイラが勝手にするから意味ない).まあ,後者は叩かれつつもJava runtimeの開発を続けてきた人たちのおかげであって,Javaの本質とは別のところかもしれないけど.どちらにしろ,ベターCなのだから結局はスクリプト言語にフットワークでは敵わない.

で,kwatchさんのサイトもそうだし,ajiyoshiさんのサイトもそうだけど,あげる例がスクリプト言語の発想そのまま(たとえば,コンパイルする言語のコード内に定数以外のデータを埋め込む人間が,センスを語るってなにごと?)だから個人的には賛同する気にならない.

Javaに至らぬところがあるのは使ってる人が一番認識してると思うけど,Javaスクリプト言語のように使った上で不満を述べられても「知らんがな」としか答えようがない.

ところで,個人的に思うJavaで何とかして欲しいところを上げていきたい.

  • ライブラリ編
    • Swingの記述が冗長って騒ぎじゃない.
    • 匿名Innerクラスが作れるようになって,だいぶ楽になったけど,それでもイベント処理関係はどうにかならないかと思う.Innerクラスを使いすぎるとスコープがどうなってるのかわかりづらくなるのが問題.Javaの先祖の一人のObjective CはJavaなんぞよりもはるかにかっこいい(と思う.というか,Interface Builder標準装備なのがね.eclipseも見習えよ).
    • stream絡みのクラス階層は流石に擁護できない
    • 同じようなことをする(けど微妙に違う)クラスが増えすぎて収拾がついてない.
  • 言語編
    • 継承って必要?Javaの次の言語があるなら真っ先に無くなる機能に思えてならない.
    • mutableなclassをimmutableに変える操作の冗長っぷりはひどい(のに,誰も指摘しないのはこの操作を必要としないから?immutableじゃないオブジェクトなんて怖くて共有できないと思うけど).
    • 変数の同期タイミングを制御できないのは,むずがゆい.同期タイミングを制御できないがために,すごいたまにしか同期してもらわなくていいのに,コストの高いvolatileやAtomic某系のクラスをずっと使わないといけない局面が多い.
    • 並列処理のモデルは現在は共有メモリ型だけど,結局ほとんど全部スレッド拘束で書かないと速いコードは書けないことを考えると,メッセージパッシングを言語レベルでもう少し取り入れても良いんじゃないかと思う.そういう意味でIBMのx10には期待してるが,現在どうなってるんだろ.
    • 最近知ったけど,配列の添え字がint限定ってのは間抜けな設計だと思う.

ちなみに,ブクマコメにあったけど,片っ端からnewして破棄するのは最近のJavaの流儀ではある.GCが苦節を重ねて改良されてきたので,インスタンスの寿命は短ければ短いほど負担が少ないし,インスタンスを使い回すよりもその場で作って捨てたほうが軽いクラスならば大抵速い.

まあ,ここで語弊があるとすれば,スクリプト言語使用者が大好きなArrayListもHashMapも軽いとは言いがたいことだけどね….というか,普通の配列の生成ですらもけっこう重い気がするのは正常なコストの反映なのだろうか,それとも,怠慢なのだろうか.