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.長い宣言行
クラス、メソッドの宣言が長い場合は以下の指針で改行を行います。
- extends, implements, throw 節で改行
- カンマで改行
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 による定数は問題なし)