私自身、Javaで仕事をするようになってから3ヶ月ちょっとがたちました。
もともとPHPで仕事はしていましたが、我流でやっていたこともあり、コーディングのルールとかがいい加減だったんですよね・・
ボス(社長)はガチのJavaエンジニアなのでその点を見てもらえるのがすごくありがたいです。
またオフィスにもEffective Javaなど著名な雑誌があります。
ここではJavaの基本的なルールについて振り返ってみたいと思います。
Contents
命名系
クラス名、メソッド名、変数名の基礎
基本全てキャメルケース。
こういうとこも意外といい加減でした。速く直したいですね・・
またクラス名は役割をあらわす名前にすることです。
社長には職業といわれました。生徒情報だったらStudent,顧客情報だったらCustomerみたいなつけ方ですね。
抽象クラスの名称はabstract
こうしないと探すときに大変です。
似たものとして、以下のようなルールがあります。
例外クラスはExceptionを末尾
テストクラスはTestを末尾
メソッドの名称
ここ超大切です。いまだに適切なものの使い分けに苦労します。
get+属性名
基本的に元からあるオブジェクトなり、プロパティを取得するときに使います。戻り値は属性の型と一緒です。
あくまで元からあるものを取得するときに使うので何かを生成する場合にはcreate,makeをつけます。
set+属性名
1つのフィールドの1つの値を設定することで、上書き。原則として戻り値なし。
put~
コレクションにKeyとValueを対にして設定することで、やはり上書き。原則として戻り値なし
add~
1つのフィールドに加算(追加)していくもの。
boolean系
true/falseがわかるものにすべき。下記が具体例です。
- is +形容詞 isEmpty
- can +動詞 canRemove
- has+過去分詞 hasChanged
- 三単元 exists
- 三単元+名詞 existsStock
isCheckなどは「チェックか?」などの意味不明の命名は使わない。
メソッド名だけでなくboolean型の変数も同様。
ちなみにflgはあまり使われないようですね。ガリガリ使ってました・・・
インスタンス変数、クラス変数
引数と同じ名称はなるべく避けるのがよいようです。知りませんでした・・・
同じ場合は、インスタンス(クラス)変数にthisを使うことが一般的ですが、引数にはa,anなど冠詞をつけて区別することがよいです。
定数
大文字+アンスコ。どの言語でも一緒ですね。
コーディング規約
アクセス修飾子
private
自クラスからしか呼ばれない場合と変数。
protected
親子関係があり、そのなかで呼び出されるとき
public
外部から自由に呼び出したいとき。基本的にメソッドと定数のみ。
修飾子なし
パッケージ内のみから呼び出すとき
インポートは*を使わない
これめんどくさいときに結構やってました。
ダメな理由としては、可読性が落ち、どのパッケージを使っているかわからなくなるから
ラッパークラス型とプリミティブ型
Integerとintが一番有名ですね。どちらでも利用可能な場合は消費メモリ、処理性能を考慮し、原則プリミティブ型を使います。
ラッパークラスを使うのはコレクションへの保持などです。ラッパークラスは等号が==ではなくequalsになります。
インデントなど
インデントは半角4つ、またスペースは意味のあるところであけ、統一すること。
{は末尾に、}は単独で使わないなど。
ここら辺IDEを使っている方はフォーマット機能などを活用しましょう。
比較演算子
<か<=を使うのがルールだそうです。知らなかった・・・
意図としては右側が大きければtrueということを統一すべきだから、というのが背景にあります。
クラス定義
finalの使用
継承させたくない、再利用させない、オーバーライドさせたくない場合はfinalです。
ちなみに定数はstatic finalで定義します。
toStringの実装
オブジェクトのデバッグなどで保持している情報を変換させるためにあると便利。
これやっとかないと後々大変です(汗)将来の自分を助けるためにも書いときましょう。
戻り値
配列やコレクションを返す場合、nullを返さずにsize0の配列やコレクションを返すようにします。
こうしないと呼び出し元でnullPointExceptionが発生します。
オブジェクト同士の比較
==ではなくequalsを使います。==の場合、値の比較ではなく、メモリの場所になります。
制御構文
オブジェクトの生成と破棄
ループの中でオブジェクトを生成し、廃棄するとメモリと処理時間が大きくなります。
文字列の結合などでStringを使わず、StringBuilderを使うのもこのためです。
その場合、ループの外でnewをして、内側ではオブジェクトを再利用する必要がでてきます。
以上、ざっと気になったもの自分が関心があり、注意すべきものをリストアップしました。
ちなみに下記書籍を参考にしました。