Okapi Project

推奨されるコーディング

バージョン
2003 年 12 月 25 日 Ver.1.0
作成者
T.Itoh ( Xware )

要約

実際にコーディングを行ってみると、同じ処理を書いてみても何通りか書けてみたり、もっと良い方法はないものかと悩んでみたりすることがあると思います。ここでは Java 言語を使ってプログラムを作成する際に一般的に推奨されるコーディングというものを集めてみました。

目次


6.コーディングの例

6.1.import の記述

基本的に import 文はクラス名を省略せずに記述します。また、複数のパッケージを import する場合はアルファベット順に並べるようにしましょう。ただし、同じパッケージから 3 つ以上のクラスを import する場合は * を利用しても構いません。
import java.util.Hashtable; … 基本的には import するクラス名を記述する。
import java.util.*; … import するクラスが 3 つ以上ある場合は * を使う。
※ import は * で記述してもコンパイル後の .class ファイルが大きくなるとかパフォーマンスに影響するなどといったことはありません。単にソースの可読性を考慮した規約です。

6.2.処理のないコンストラクタ

何も処理を行わないコンストラクタは記述しないものとします。
public class DateEdit {

    public DateEdit(){  … このような何も処理を行わないコンストラクタは記述しない。
    }
}

6.3.オブジェクトの同値比較

String 型の変数の内容を比較する場合は String#equals() を利用し、== を使用しないようにします。オブジェクトの比較処理では基本的に Object#equals() を利用することになります。例外的にオブジェクトのアドレスを比較しなくてはならない場合などは == を利用しますが、これは極めて稀なことです。
String a = "abcd";
if(a == "abcd"){ … この記述では必ず else に処理が流れてしまう。
}else{
}

if(a.equals("abcd")){ … このように String#equals() を使用する。
}else{
}

6.4.文字列の操作

String 文字列に別の String 文字列を連結させる場合、+ でつなげて連結してはいけません。このような場合は StringBuffer クラスを使用します。
String year  = "2003";
String month = "10";
String day   = "25";

String today = year + month + day; … ×

StringBuffer SB = new StringBuffer("");
SB.append(year);
SB.append(month);
SB.append(day);

String today = SB.toString(); … ○(StringBuffer クラスを利用する)

6.5.長い行

1 行最大文字数は半角 80 文字とします。Eclipse などの統合開発環境では Java エディタなどで 80 桁の部分に線を表示することなども可能ですが、一般的には統合開発環境などのソースエディタ部分で行が折り返さない程度としています。Unix 系 OS でコンソールを利用する場合には 80 桁が基本になるのでこの 1 行あたりの桁数は重要な問題です。長くなった行は改行します。改行の指針としては、 とします。
double length = Math.sqrt(Math.pow(Math.random(),2.0) + Math.pow(Math.random(),2.0);
を改行する場合、

【ローカル変数を利用する】
double xSquared = Math.pow(Math.random(),2.0);
double ySquared = Math.pow(Math.random(),2.0);
double length   = Math.sqrt(xSuared + ySqured);

【カンマで改行する】
double length = Math.sqrt(Math.pow(Math.random(),2.0),
                        + Math.pow(Math.random(),2.0);

【優先度の低い演算子の前で改行する】
return this == obj
                 ||(this.obj instanceof MyClass
                 && this.field == obj.field);

6.6.長い宣言行

クラス、メソッドの宣言が長い場合は以下の指針で改行を行います。
public class LongNameClassImplemenation
                 extends AbstractImplementation,
                 implements Serializable, Cloneable {

    private void longNameInternalloMethod(int a, int b)
                     throws IOException {
    }

    public void longMethodSignature(int a, int b, int c,
                                    int d, int e, int f) {
    }
}

6.7.abstract class と interface

抽象クラス(abstract class)はなるべく使わず、interface を多用するようにしましょう。理由として、interface はいくつでも実装が可能ですが、class の継承は 1 つだけしかできないため非効率になるからです。
public class DateEdit extends PreDateEditAbstract implements Serializable, Cloneable {

}

6.8.public 変数

インスタンス変数は極力 public にはせず、妥当なアクセサメソッドを設けるようにします。理由として、この方法は JavaBeans の仕様として定められており、クラスの内部状態に勝手にアクセスできるようにさせるのはよくないという判断からです。
しかし、以下のような場合はインスタンス変数を public にして直接アクセスさせても構いません。
public class DateValue {

    private String startDate;

    public void setStartDate(String startDate){
        this.startDate = startDate;
    }

    public String getStartDate(){
        return this.startDate;
    }
}

6.9.初期化

初期化を当てにしてはいけません。また、2 度初期化するような処理は書いてはいけません。
private String name = "OkapiProject"; … 変数を宣言するタイミングで初期化をしておくのが○。

または、

public class Okapi {

    private String name;

    public void okapiProject(){
        this.name = "okapi";          … 使用する際に一度だけ初期化する。
    }
}

6.10.static 変数を避ける

static 変数(クラス変数)は極力避けるようにしましょう。ただし、static final とする定数については別です。理由は、static 変数はセミグローバルといって良いもので、より文脈依存なコードになってしまうからです。
public static String name; … △(なるべく static 変数は避ける)
public static final name = "OkapiProject"; … ○(static final による定数は問題なし)

Copyright © 2003 - 2006 Okapi Project All Rights Reserved.