Javaエンコーディングガイド(6)

6074 ワード


5.2     修飾子仕様
【JAVA-8】       適切な権限を使用して【推奨】を宣言する
説明・原因
private、publicなどのアクセス修飾子の意味を十分に理解し、Class、Method、変数、変数、定数などを適切な権限で宣言します.
 
【JAVA-9】       継承したくないClassについてはfinal【推奨】を宣言
説明・原因
継承したくないClassについてはfinalを宣言してください.次のようなメリットがあります.
l  Classの継承やMethodなしのリロードなどは、コンパイラに通知されるので、コードの最適化をより適切に行うことができる.
l  finalを宣言することで、Classを継承しないことを明確にし、可読性を向上させることができます.
 
【JAVA-10】    publicとして宣言されていないClassでpublic権限を生成しないコンストラクタ【推奨】
説明・原因
publicではないClassでコンストラクタを生成した場合、誤ってpublicと宣言したのではないでしょうか.どこからでもアクセスできるpublicではないClassのコンストラクタではありません.たとえば,次のようなエラー例では,このコンストラクタのClassを別のPackageから呼び出すことはコンパイルには通じない.これを防ぐには、コンストラクタからpublic修飾子を削除したり、Classにpublic修飾子を付けたりするなど、再設計してください.

class BadSample{//非public Classpublic BadSample()/エラー    }}class FixedSample{FixedSample()/正しい    }}
 
【JAVA-11】   オーバーライドしたくないMethodにはfinal【推奨】を使用
説明・原因
オーバーライドができないことがわかっている場合はfinalを宣言します.これにより、コンパイラは誰もオーバーライド(書き換え)Methodができないことを知っているので、コンパイラは最適化コードを生成することができ、パフォーマンスも向上します.
 
【JAVA-12】    Instance変数はprivateに設定してください【推奨】
説明・原因
オブジェクト向けのカプセル化を考慮すると、誰もがClassの内部状態にアクセスできるようにすることは望ましくありません.したがって、適切なget/set Methodを定義することができ、このMethodによってのみInstance変数にアクセスできます.

public class BadSample{public int value=10;//エラー}public class FixedSample{private int value=10;//正しいpublic int getValue(){return value;;    }}
 
【JAVA-13】   InstanceフィールドのMethodを使用せずにstaticと宣言【注意】
説明・原因
MethodがInstanceフィールドを使用しない場合、staticキーを使用してこれらのMethodを宣言する必要があります.したがって、Instance Dataを使用しないMethodについてはstaticとして宣言する必要があります.

public class ASI {    public int add (int i, int j) { //エラー        return i + j;    }}public class ASIFixed {    public static int method (int i, int j) { //正しい        return i + j;    }}
 
【JAVA-14】   InterfaceのMethodとフィールドの修飾子をわざわざ説明する必要はありません【推奨】
説明・原因
interface Methodは通常publicおよびabstractです.Interfaceフィールドは通常public、static、finalです.修飾子は自動的に適用されます.したがって、わざわざ修飾子を説明する必要はありません.
interface AAI {
     public void method ();    //    Method   public
     abstract int getSize (); //    Method   abstract
     static int SIZE = 100;   //         static
 }
interface AAIFixed {
     void method ();  //   
     int getSize ();  //   
     int SIZE = 100;  //   
 }

 
5.3     Import仕様
【JAVA-15】   Java.lang Packageをインポートしない【規定】
説明・原因
Java.lang Packageは明確にインポートする必要はありません.開発者はこのPackageを明確にインポートする必要はありません.

import java.lang.*;//エラー
 
【JAVA-16】   通常、プログラム内部で使用されるpackageはimport文でプログラムヘッダに宣言されます.原則として、プログラム内部にはimport宣言のないクラスは現れません【推奨】

JAva.io.File file=new java.io.File("test.txt");//エラーFile=new File("test.txt");//正しい
 
しかし、混同される声明は、プログラムの中で特にそのpackageの中にあることを指摘しなければならない.

import java.util.Date;import java.sql.Date;…java.util.Date date = new java.util.Date();
 
【JAVA-17】   プログラムで使用されるクラスはImportで宣言するべきですが、プログラムで使用されていないクラスはImportに表示されません【推奨】

import java.util.HashMap;   -> 削除...(プログラムではHashMapのようなクラスは使用されていません)
 
5.4     文字列仕様
【JAVA-18】   文字列のフォント値を保持するためにString Objectを生成する場合はnew【推奨】を使用しません
説明・原因
String Objectに文字列定数をコピーするのは、時間の無駄な冗長な作業です.new Objectを生成するのではなく、static finalフィールドに文字列定数を記述してください.

private String _s = new String ("ACDO"); //エラーprivate String_s="ACDO"; //正しい
 
【JAVA-19】   文字列が同じ値かどうかを比較する場合は、equals()Method【推奨】を使用します.
説明・原因
"=="および"!="演算子を使用して演算子を演算します.Stringが同じ文字列であるかどうかを比較するのではなく、同じInstanceであるかどうかをチェックします.これはエラーの原因になる可能性があります.したがって、同じ文字列であるかどうかを比較する場合は、String Classのequals()を使用します.Method.Literalの場合、同じ内容であればコンパイラが同じInstanceになるように最適化されますので、"=="を使用してもString Classのequals()Methodの結果は同じですが、符号化時にこのルールを守ってください.

public boolean compare(String name, String anotherName){     return name==anotherName;//エラー}public boolean compare(String name,String anotherName){     return name.equals(anotherName);//正しい}
 
【JAVA-20】   更新する文字列にStringBuffer Classを使用する【推奨】
説明・原因
StringのObjectは固定文字列で、接続すると毎回Objectが再生成されるので性能が低下します.変更する文字列はStringBufferで定義し、文字列を接続する場合はStringBuffer Classのappend()Methodを使用してください.

String fruit="apples";fruit+=",banans";//エラーStringBuffer fruit=new StringBuffer(15);fruit.append("apples");//正しいfruit.append(",banans");//正しい
 
【JAVA-21】   Primitive(原語)型とString Objectの変換には、パッケージ類のMethodを使用します【規定】
説明・原因
String型と原語型の変換には、いろいろな方法がありますが、既存の変換用のMethodを使うと、最も分かりやすく、処理も最も効率的です.

//エラーint->Stringの変換String sample=""+integer;String sample=(new Integer(integer).toString();String->intの変換int integer=(new Integer(sample).intValue();int integer=Integer.valueOf(sample).intValue();//正しいint->Stringの変換String sample=String.valueOf(integer);String->intの変換int integer=Integer.parseInt(sample);
 
【JAVA-22】   クエリ文字列に文字が含まれているかどうかはcharAt()Method【推奨】を使用します.
説明・原因
クエリ文字列に文字が含まれているかどうか、パラメータが1文字の場合はString ClassのcharAt()Methodを使用します.startsWith()は、複数の文字列をパラメータオブジェクトMethodとして使用します.パラメータが1文字のstartsWith()Methodを使用しても実行できますが、これはString APIの誤った使用方法です.
注意:startsWith()をchartAt(0)に置き換える場合は、まず文字列の長さが少なくとも1文字であることを確認してください.

public boolean checkHead(String checkString) {    return(checkString.startsWith("E");//エラー}public boolean checkHead(String checkString){    return(checkString.length()>0&&checkString.charAt(0)=‘E’;//正しい}
 
【JAVA-23】   システム依存記号(n、rなど)を使用しない【推奨】
説明・原因
OSによって改行コードとしての文字や文字列が異なります.そのため、「」や「r」などを改行コードとしてコードに直接使用すると、汎用性が低下します(Javaの「Write Once,Run Anywhere」の汎用性の特徴を失います).コードに改行コードを使用したい場合は、System.getProperty()を使用しますシステムに適した改行コードを取得して利用します.

StringBuffer result=new StringBuffer("Message:");//エラーStringBuffer result=new StringBuffer("Message:");result.append(System.getProperty("line.separator");//正しい