TOP設計・移行・活用> はじめに
Javaコーディング規約
Javaコーディング規約

第11回:コレクション・ストリーム・例外に関するコーディング規約
著者: 電通国際情報サービス
高安 厚思、東田 健宏、玉村 雅也
   2006/1/12
1   2  3  4  次のページ
はじめに

   今回はコレクション・ストリーム・例外に関する規約を説明します。「コレクション」「ストリーム」「例外」という言葉は、Javaのプログラムを書く上で一度は必ず目にするかと思います。これらを熟知しないで実装すると、表1にあげるような問題を引き起こす可能性があります。
  • 昔からコレクションクラスを使用しているが、リソース消費が多く、パフォーマンスが上がらない
  • メモリリークやOutOfMemoryの発生する原因がわからない
  • 例外処理を実装しているが、例外の種類に応じた処理ができていない

表1:規約を知らないことによる問題

   今回説明する規約を守ることによって、表1にあげる問題をさけることができるようになるでしょう。初心者の方だけではなく中級者にも一読いただき、よりよいJavaプログラミングの一助としてください。

本連載で紹介する規約に関しては、規約名のみを記述しています。規約そのものは、以下のURLからダウンロードして確認してください。
http://www.objectclub.jp/community/codingstandard/JavaCodingStandard2004.pdf


コレクション

   古いコレクションクラスは可読性が低く、パフォーマンスもよくありません。Java2以降で同一の機能を実現できるコレクションクラスがある場合は、優先的にJava2以降のコレクションクラスを使用するべきです。


Java2以降のコレクションクラスを好め(C_CLT001)

   java.utilパッケージで提供されているコレクションクラスを使用するときは、ArrayListクラスやHashMapクラスなどのJava2以降のコレクションクラスを使いましょう。

   読者の中にはJDK 1.0の時から存在しているVectorクラスやHashtableクラスをよく利用している方もいるかもしれません。しかしVectorクラスやHashtableクラスは処理が遅く、データ構造変更の負荷が高いという難点があります。

   Java2以降ではこのような昔から存在するコレクションクラスよりも、汎用的かつ統一的に扱えるコレクションフレームワークがサポートされるようになりました。ListやMapなどのインタフェースとそれを実装したArrayListクラスやHashMapクラスを使うことにより、整理されたわかりやすいメソッドを利用できます。


特定の型のオブジェクトだけを受け入れるコレクションクラスを利用する(C_CLT002)

   コレクションクラスを利用するときは無作為にオブジェクトを格納するのではなく、特定のオブジェクトを格納するようにしましょう。

   無作為に様々な型のオブジェクトを格納してしまうと、格納したオブジェクトを取り出す際に表2にあげる問題が発生します。

  • Stringのみ格納されていると思い込み、キャストしたらClassCastExceptionが発生した
  • オブジェクトの型をinstanceofでチェックして、キャストを行っている

表2:格納したオブジェクトを取り出す際の問題

   以下のサンプルコードのようにクラスを作成することで、String以外のオブジェクトを格納する際にはコンパイル時にエラーとすることができます。こうすることで、ランタイムでしか発見できないようなバグ(ClassCastExceptionなど)を減らすことができます。またinstanceofで型をチェックする必要がないため、コードもシンプルになり、可読性も向上します。

特定の型のオブジェクトだけを受け入れるクラスサンプル
public class StringHashMap {
     private HashMap map = new HashMap();

     public void put ( String key, String value) {
          map.put( key, value);
     }

     public String get( String key ) {
          return (String)map.get(key);
     }
}

   なおJava5ではGenericsという技術(C++のテンプレートに類似)によって、本規約は下記サンプルのように簡単に実装できるようになりました。参考にしてみてください。

特定の型のオブジェクトだけを受け入れるGenerics(Java5)サンプル
public class GenericsSample {
     Map<String, String> strMap = new HashMap<String, String>();
     String str = strMap.get(i);
}

   Mapとして宣言されたstrMapは、上記のStringHashMapと同様の性質をもつHashMapクラスのインスタンスが格納されています。strMapのgetメソッドやputメソッドにString型以外を代入するとコンパイルエラーとなります。

1   2  3  4  次のページ

参考文献など
Javaコーディング規約2004は以下のサイトおよび書籍として発表しています。本連載と共に参考にしてください。

「Javaコーディング規約2004」 http://www.objectclub.jp/community/codingstandard/JavaCodingStandard2004.pdf

「オブジェクト倶楽部」
Javaコーディング規約2004は、オブジェクト倶楽部で公開して頂いております。 http://www.objectclub.jp/

「超図解 Java ルールブック」
Javaコーディング規約が「超図解 Java ルールブック」という名前で書籍になりました。規約の詳しい内容に関しては本書籍をご覧ください。
http://www.x-media.co.jp/xbook/index.cfm?ID=6


Javaコーディング規約を理解するに際しての参考サイトをご紹介します。

「Code Conventions for the Java Programming Language」 http://java.sun.com/docs/codeconv/
※日本語訳を提供しているページ
http://www.tcct.zaq.ne.jp/ayato/programming/java/codeconv_jp/


Java コーディング規約を理解するに際しての参考書籍をご紹介します。

「Java の格言」
「Java の鉄則」
「リファクタリング - プログラミングの体質改善テクニック」
「The Elements of Java Style」
「Effective Java - プログラミング言語ガイド」
「Essential Java Style」
「Javaクックブック」
「標準FindBugs完全解説」
株式会社電通国際情報サービス 開発技術センター 高安 厚思
著者プロフィール
株式会社電通国際情報サービス  高安 厚思
株式会社電通国際情報サービス 開発技術センター
Java(J2EE)/オブジェクト指向の研究開発やプロジェクト支援、開発コンサルティングに従事。モデル、アーキテクチャ、プロセスが探求対象。今回は Javaコーディング規約2004の仕掛け人。


株式会社電通国際情報サービス 開発技術センター 東田 健宏
著者プロフィール
株式会社電通国際情報サービス  東田 健宏
株式会社電通国際情報サービス 開発技術センター
CTI、Webアプリの開発経験を経て、現在は主にプロジェクトマネジメント支援、プロセスエンジニアリング、ソフトウェア工学研究開発に従事。最近はコーチング、ファシリテーションといったヒューマン系スキルに興味を持ち日々修得に努めている。


株式会社電通国際情報サービス 開発技術センター 玉村 雅也
著者プロフィール
株式会社電通国際情報サービス  玉村 雅也
株式会社電通国際情報サービス アウトソーシング事業部
Securityに関わる研究開発やプロジェクト支援の経験を経て、現在は大手企業の管理会計システムのBPRプロジェクトに従事。最近は難敵ABAPと戦いながら、日々を送っている。


INDEX
第11回:コレクション・ストリーム・例外に関するコーディング規約
はじめに
  ストリーム
  例外
  Error、Throwableクラスを継承しない(C_EXT004)