TOP設計・移行・活用> 文字列リテラルはnewしない(C_STR002)
Javaコーディング規約
Javaコーディング規約

第8回:文字操作・数値・日付に関するコーディング規約
著者: 電通国際情報サービス
高安 厚思、東田 健宏、青木 応樹   2005/11/15
前のページ  1  2   3  4  次のページ
文字列リテラルはnewしない(C_STR002)

   文字列リテラルを保持するためのStringオブジェクトを生成する際、newは使用しないようにします。これは、newを使用するとJava VMによっては無駄なStringインスタンスが生成されてしまうからです。
private String badSampleString = new String ("Literal"); ⁄⁄悪い例
private String fixedSampleString = "Literal"; ⁄⁄良い例
   例に示した2つのStringオブジェクトはどちらも同じ内容の文字列を保持していますが、生成されるインスタンス数が異なります。不必要なメモリ消費を抑えるために、Stringではnewを使用しないようにしてください。


更新される文字列にはStringBufferクラスを利用する、更新されない文字列にはStringクラスを利用する(C_STR003、C_STR004)

   Stringのオブジェクトは固定文字列であり、値を更新するたびに新たなオブジェクトが生成されます。

   よって変更される文字列はStringBufferオブジェクトで定義し、文字列連結の際にはStringBufferクラスのappend()メソッドを用います。

   一方、変更されない文字列はStringBufferオブジェクトで定義するのではなく、Stringオブジェクトを使用します。Stringオブジェクトを使用することでメモリ操作が行われなくなるので、パフォーマンスの向上につながります。

   パフォーマンスの悪化を防ぐために、文字列が変更されるのかされないのかを見極め、どちらのオブジェクトを使用すべきか正しく判断してください。


文字列リテラルと変数を比較するときは、文字列リテラルのequals()メソッドを利用する(C_STR005)

   文字列リテラルと変数を比較する場合、2通りの記述があります。

Stringオブジェクトのequals()メソッドを使う場合
public boolean validate (String userInput) {
     if(userInput != null && userInput.equals("y")) {
          return true;
     }
     return false;
}
   この場合、equals()メソッドを呼ぶ前にStringオブジェクトがnullでないことを確認する必要があります。

文字列リテラルのequals()メソッドを使う場合
public boolean validate (String userInput) {
     if("y".equals(userInput)) {
          return true;
     }
     return false;
}
   一方こちらの場合は、文字列リテラルはnullでないことが明らかなため、nullの確認は必要ありません。nullの確認の実装漏れによるバグ防止、またはコードの可読性・保守性向上のために、文字列リテラルのequals()メソッドを使用してください。


プリミティブ型とStringオブジェクトの変換には、変換用のメソッドを利用する(C_STR006)

   String型とプリミティブ型との変換には様々な方法がありますが、表記を統一することで誰が読んでもわかりやすいコードになります。

  • プリミティブ型からString型への変換には、StringクラスのvalueOf()メソッドを使用する
  • String型からプリミティブ型への変換には、各プリミティブ型のラッパークラスの変換メソッドを使用する

表2:String型とプリミティ型の変換

   これら変換用メソッドを使用することで誰が書いても同じ表現に統一され、結果としてコードの可読性・保守性・プログラムの処理効率の向上につながります。


文字列の中に、ある文字が含まれているか調べるには、charAt()メソッドを利用する(C_STR007)

   文字列の中にある1文字が含まれているかを調べる場合は、StringクラスのcharAt()メソッドを使用してください。

   よくある例として、startsWith()を使用してある1文字ではじまるかを調べているコードを見かけます。startsWith()メソッドは複数文字列を引数の対象とするため、これはString APIの誤った使用法です。

   なお、startsWith()をcharAt(0)に置き換える際は、以下のように文字列の長さの確認を忘れないように注意してください。

public boolean checkHead (String checkString) {
     if (checkString.length > 0 && checkString.charAt(0) == 'E') {
          return true;
     }
     return false;
}
システム依存記号(\n、\rなど)は使用しない(C_STR008)

   ポータビリティ(移植性)を維持するために、「\n」や「\r」などのシステム依存記号は使用せずにSystem.getProperty()メソッドを使用してください。「\n」や「\r」などを改行コードとしてコードにリテラルで使用した場合、OSが変わると正しく動作しなくなります。

   これでは、Javaの特徴「Write Once, Run Anywhere」が失われてしまいます。

   システム依存記号ではなく、下記のようにシステムに応じた改行コードやファイル区切り文字を取得するようにしてください。

System.getProperty("line.separator")
System.getProperty("file.separator")
前のページ  1  2   3  4  次のページ


株式会社電通国際情報サービス 開発技術センター 高安 厚思
著者プロフィール
株式会社電通国際情報サービス  高安 厚思
株式会社電通国際情報サービス 開発技術センター
Java(J2EE)/オブジェクト指向の研究開発やプロジェクト支援、開発コンサルティングに従事。モデル、アーキテクチャ、プロセスが探求対象。今回は Javaコーディング規約2004の仕掛け人。


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


株式会社電通国際情報サービス 青木応樹
著者プロフィール
株式会社電通国際情報サービス  青木 応樹
株式会社電通国際情報サービス アウトソーシング事業部所属
主にJavaを用いたシステム開発に従事。最近は設計・マネジメントスキルの習得に励んでいます。


INDEX
第8回:文字操作・数値・日付に関するコーディング規約
  はじめに
文字列リテラルはnewしない(C_STR002)
  数値
  日付