【Java】Javaコーディング規約2004 個人的メモ その3
暇つぶしに読んだJavaコーディング規約2004の個人的メモその3です。
その1、その2はこちらから。
【Java】Javaコーディング規約2004 個人的メモ その1
【Java】Javaコーディング規約2004 個人的メモ その2
______________________________
C_CTR009 繰り返し処理中のオブジェクトの生成は最小限にする
スコープは可能な限り狭くするのが常識だとは言うものの、
ループ内で使う場合はループの外で生成し、ループ内では都度初期化するようにしましょう。
スコープがネスト1個分広くなってしまいますが、パフォーマンスの方が大事です。
public void SampleMethod(String[] array){ StringBuffer sampleBuffer = new StringBuffer(); //ループの外で生成 for (int i = 0; i < array.length; i++) { sampleBuffer.append("log: "); sampleBuffer.append(array[i]); System.out.println(sampleBuffer.toString()); sampleBuffer.setLength(0); //初期化 } }
C_TRD004 synchronized ブロックから synchronized ブロックのあるメソッドを呼び出さない
言われたらデッドロックの可能性がすぐに思い浮かぶのですが、
意識していないと知らず知らずのうちに書いてしまうかもしれない危険なソース。
特にsynchronzedを付けるのは排他関連の制御がわりとナイーブな処理が多いと思うので、
処理中にsynchronzedなメソッドが集中している可能性があります。
C_TRD009 同期化(synchronized)の適用は必要な部分だけにする
メソッドをsynchronized宣言すると、インスタンスごとロックするという話。
割とメソッドごとsynchronizedにして安心してたのですが、危険だったんですね。
C_STR003 更新される文字列には StringBuffer クラスを利用する
基本ですが、割とあるので。
C_STR005 文字列リテラルと変数を比較するときは、文字列リテラルの equals()メソッドを利用する
あぁなるほどなー、とは思いましたが、メリットがnullチェックしなくて良いくらいなので、
主語となる変数を明確にしたい場合は逆でもいいのかな、と個人的には思います。
public boolean validate(String userInput) { return (userInput != null && userInput.equals(“y”); //別にこれでも良いかと }
C_GC002 アプリケーションから finalize()を呼び出さない
以前の記事に、「finalize()は可能な限りオーバーライドしない方がよい」と書きましたが、
仮に実装したとしても、それをアプリケーション内で明示的に呼び出す必要はありません。
finalize()はGCによって自動で呼び出されるため、
アプリケーションから呼ぶと2度呼び出してしまうことになるためです。
ただ、本当かどうかわかりませんが、アプリケーションの終了時にはGCが走らず、
finalize()が呼ばれないという話もあるため、
いずれにせよ、finalize()のオーバーライドは可能な限り避けたほうが良さそうです。
______________________________
他にも気になる項目はいくつかありましたが、とりあえず以上で終わります。