skillup

技術ブログ

Java

Javaのコーディングルール

投稿日:

私自身、Javaで仕事をするようになってから3ヶ月ちょっとがたちました。

もともとPHPで仕事はしていましたが、我流でやっていたこともあり、コーディングのルールとかがいい加減だったんですよね・・

ボス(社長)はガチのJavaエンジニアなのでその点を見てもらえるのがすごくありがたいです。

またオフィスにもEffective Javaなど著名な雑誌があります。

ここではJavaの基本的なルールについて振り返ってみたいと思います。

命名系

クラス名、メソッド名、変数名の基礎

基本全てキャメルケース。

こういうとこも意外といい加減でした。速く直したいですね・・

またクラス名は役割をあらわす名前にすることです。

社長には職業といわれました。生徒情報だったら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をして、内側ではオブジェクトを再利用する必要がでてきます。

以上、ざっと気になったもの自分が関心があり、注意すべきものをリストアップしました。

ちなみに下記書籍を参考にしました。

「実践javaコーディング作法」

-Java
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

日付けのメソッド

どのプログラムでも必須となる日付け処理。 言語が違うといろいろと面倒です。 とりあえず頻出のものを整理したいと思います。 Contents1 現在時刻の出力2 日付けの設定・取得3 日付けの整形4 文 …

no image

依存ライブラリを含むプログラムのjar化に関して

以前、jar化する場合のpomの記述方法について書いたのですが、一部記述が正しくなかったようです。 mavenでのjarファイル作成 この方法でやってもjarファイルを単独で取り出すとNoClassD …

no image

jenkinsのオートデプロイ

久々にJavaやりました。 Contents1 やりたいこと2 ハマりポイント2.1 Antでのjobの設定2.2 jenkinsでビルドできない2.3 jenkinsのオートデプロイ2.4 SSHで …

no image

RedmineAPI活用法

自社ではRedmineで基本的にタスク管理をしておりまして、チケット作成に手当がついたりします。 Redmine単体でもいろいろな機能があるのですが、 今月の作成したチケットと完了したチケットを手当と …

no image

開発環境と本番での設定ファイル変更

開発と本番で設定ファイル自体(web.xmlなど)はわけると思うのですが、以前はわからず、開発のものと本番のものを手動でわけていました。 Javaでどうやってやるかを調べたところ、pomにかなり便利な …