16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

【Java】Javaコーディング規約2004 個人的メモ その2

暇つぶしに読んだJavaコーディング規約2004の個人的メモその2です。

その1、その3はこちらから。

【Java】Javaコーディング規約2004 個人的メモ その1
【Java】Javaコーディング規約2004 個人的メモ その3

__________________________________________________

C_VAL004 できるだけローカル変数を利用する

変数のスコープはできるだけ狭くするというのはコードを書く上で常識ですが、
その理由は変数が意図しないところで使われないようにするための安全性・保守性だけでなく、
実はパフォーマンスにもあります。

要するに、クラス変数やインスタンス変数よりもローカル変数へのアクセスの方が速いのです。
特にループの中で頻繁に書き換えるような変数の場合、
そのループ用に別の変数を宣言してでもローカル変数を使うべきです。

public class Sample {
  private int sum;

  public void addNumber(int[] numbers) {
    int tempSum = sum; //ループ内で使うために別のローカル変数を宣言する
    for (int i = 0; i < numbers.length; i++) {
      tempsum += numbers[i];
    }
    sum = tempSum;
  }
}


C_IVL001 インスタンス変数初期化のタイミングは「コンストラクタ」または、「インスタンス変数宣言時」
または「初めて値が get されるタイミング(Lazy Initialization)」のいずれかにせよ

インスタンス変数の初期化のタイミングには3つのパターンが考えられ、
それぞれメリット・デメリットがあるので都度判断して適切なものを使いましょう、という話。
メリット・デメリットを加味して使い方を簡単にまとめると、

 ・インスタンスごとに初期値を変えたい場合 ⇒ コンストラク
 ・インスタンスごとに初期値を変える必要がない場合
  ↓
  ・変数が頻繁に何度も呼ばれる場合 ⇒ インスタンス宣言時
  ・変数はあまり呼ばれない場合   ⇒ getされるタイミング

あたりの使い分けが良いかなと思います。


C_CVL001 public static final 宣言した配列を利用しない

finalで配列を宣言した場合、不変なのは配列のサイズだけで、配列の要素は変更可能です。
定数のようなつもりでつかっていると、ふとした時に痛い目を見ることになりかねません。


C_LVL002 ローカル変数は安易に再利用しない

基本的に、変数もメソッドやクラスと同じく、役割は1つです。
「変数をあんまり多く宣言したくない」と言って抽象的な名前を付けて使いまわす方もいますが、
可読性からすれば具体的な名前を付けて使い捨てるほうが、スコープも狭くて分かりやすいです。


C_IHT003 スーパークラスでprivate宣言されているメソッドと同じ名前のメソッドをサブクラスで定義しない

スーパークラスでprivate宣言されているメソッドを、
オーバーライドできないからと言って同名でサブクラスにも実装するのは良くないです。
その場合は違う名前をつけるか、スーパークラス側でオーバーライドを可能にしましょう。


C_CTR007 breakや continueは使わないほうがわかりやすい

これはうそだろー。
サンプルを見ても、修正サンプルでは無駄にネストが深くなっています。
基本的にネストは浅い方が読みやすいので、
サンプルのようにループ内の特定の時にだけ例外的にスキップしたりループを抜けたりするなら、
continueやbreakはむしろ明示的でわかりやすいです。

private void useContinue(){ 
  int skipNumber = 5; 
  for (int i = 0; i < 10; i++){ 
    if ((i + 1) == skipNumber){ 
      continue; //skipNumberの時だけ例外的に処理を飛ばすのだから、明示的に書く方が分かりやすい
    } 
    System.out.println((i + 1) + "回目です。"); 
  }
}  


__________________________________________________


その2は以上。

ローカル変数の再起動とかbreak,continueについては意見の分かれるところだとは思いますが、
個人的にはプリミティブ型の変数ならばんばん宣言してばんばん使いすてて良いと思いますし、
continueやbreakをするのはループ内で特別な条件に当てはまる時が多いと思うので、
ループ内のメインロジック部分のネストを深くしないためにもどんどん使えばいいと思います。



その1はこちら
その3はこちら