カレーなる辛口Javaな転職日記 RSSフィード

2005年 12/16

static修飾子は多用するべきか?

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26905&forum=12

なんというか,懐かしいネタだ.今時こんな懐かしいネタにお目にかかれるとは思いもよらなかった.


結論:多用すべきではない.

設計上必要があれば使えばいいが,そうでなければ使うべきではない.

同一クラスの全てのインスタンスで共有される『staticフィールド』や『staticメソッド』。これについては、『メモリ領域を共有する』という説明がされています。

厳密にいうと少し違う.通常はstaticフィールドが物理メモリを共有するように実装されるだろうが,それは仕様書で求められるものではない.

スレッドセーフであるなら(もしくはセーフでなくても構わないなら)、staticはガンガン使うべきだ、というふうに思っています。

スレッドセーフとstatic/非staticは何の関係もない.スレッドセーフの意味を理解していないゆえの発言だろう.

『staticはダメだ。staticがあるからJavaがダメだという評価もあるほどだ』と言われて驚きました。

これは珍しい.「純粋オブジェクト指向論者」みたいな極端な過激派でもない限りは,こういう意見はまずない.普通は「staticを乱用すると,極めて不自然な設計になる.」という程度.ひょっとしたら「そういう初心者を惑わしてきたという点で,static変数は罪が大きかった」という意味かもしれない.いずれにせよ,それは初心者の下手くそな設計が悪いだけで,static変数やstaticメソッドが悪いわけではない.

staticフィールドは速いよ。

それは関係ない.他の要因の方が遙かに大きな比重を占めており,staticか否かはほとんど無視して良い.少なくとも生産性を下げてまで使うだけのメリットはない.

そういえば、このまえ StringBuffer よりも String を使用したほうが速いという話をどこかで聞きました。

条件による.少なくともJDK1.5以後はStringBuilderを使うべき.

従来、String よりも StringBuffer のほうが高速である、というのが定説でした。

これは最初から間違いだった.Javaや不変オブジェクトの性質を理解してない初心者が広めたデマにすぎない.

気にせずに String の連結をしまくってきた私は勝ち組ですね。

負け組だと思うぞ.条件によってはStringの連結がボトルネックになることもあるし,逆にStringBufferの利用がボトルネックになることもある.それを理解して使い分けられるのが本物のJava開発者だ.

速度だのメモリの節約だの、仕様書に規定があるの?

たしかに仕様書にはない.

実装の結果、ぶっちゃけ偶然の産物じゃないのかよ。

たしかにマイクロベンチマークは,ほとんどあてにならない.「試しに測ってみたら遅かった/早かった」と言っているものの9割以上は眉唾物だろう.

しかしだからと言って,仕様や設計がパフォーマンスに影響を与えないわけではないし,早く動く可能性の高いコードや遅く動く可能性の高いコードというのは存在する.すべてを「偶然」の一言で片づけるのは,プロにはあるまじき行為だ.

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

トラックバック - http://d.hatena.ne.jp/JavaBlack/20051216/p1
リンク元