第八章、汎用プログラム設計(一)
5468 ワード
第四十五条、局所変数の作用域を最小化するローカル変数の役割を最小化し、コードの可読性とメンテナンス性を向上させ、エラーの可能性を低減することができる.C言語とは異なり、ローカル変数は1つのコードブロックの先頭で宣言する必要があり、Javaは文が表示される任意の場所で変数を宣言することを許可します. の最も強力な方法は、初めて使用した場所で宣言することです.ローカル変数を早期に宣言すると、その役割ドメインが早期に拡張されるだけでなく、終了が遅すぎます.ローカル変数の役割ドメインは、宣言された点から周辺ブロックの終了まで拡張されます. のほとんどのローカル変数の宣言には、初期式が含まれている必要があります.変数を有意義に初期化するのに十分な情報がない場合は、初期化できるまでこの宣言を延期する必要があります.(例外はtry-catch文に関係し、変数はメソッドによって初期化されますが、このメソッドはchecked exceptionを放出する可能性があります.変数はtryの内部で初期化する必要があります.) サイクルでは、変数の役割ドメインを最小化するための特別な機会が提供される.forループは、ループ変数の宣言を許可します(loop variable)は、その役割ドメインがちょうど必要な範囲内に限定されている:循環体、循環体の前の初期化、テスト、更新部分.したがって、循環終了後に循環変数の内容が不要になった場合、for循環はwhile循環よりも優先される.for循環はwhile循環に比べてもう一つの利点は、より短く、可読性が増加することである.
第46条、for-eachサイクルは従来のforサイクルより優先する Java 1.5の前に、集合を巡回するプリファレンス: 複数の集合をネスト反復する場合、for−eachサイクルの利点はより顕著である.for-eachループは、集合と配列だけでなく、Iterableインタフェースを実装するオブジェクトも遍歴させます.この単純なインタフェースは単一の方法で構成される: では、for-eachサイクルが使用できない場合が3つあります. フィルタ:コレクションを巡回し、選択した要素を削除する必要がある場合は、removeメソッドを呼び出すために明示的な反復器を使用する必要があります. 変換:リストまたは配列を巡回し、他の要素値またはすべての要素値に代わる必要がある場合は、要素の値を設定するために、リスト反復器または配列インデックスが必要です. 平行反復:複数のセットを並列に巡回する必要がある場合は、すべての反復またはインデックス変数が同期して前方シフトできるように、反復またはインデックス変数を明示的に制御する必要があります.
第47条クラスライブラリの理解と使用標準クラスライブラリを使用することで、これらの標準クラスライブラリを作成する専門家の知識と、あなたの前の他の人の使用経験を十分に利用することができます.また、仕事にあまり関係のない問題に特別な解決策を提供する時間を無駄にする必要はありません.また、それらの性能は時間が経つにつれて向上することが多い.自分のコードを主流に溶け込むことができます. Javaプログラマーはjavaに詳しいはずです.lang、java.牙列缺损ioの内容は,他のクラスライブラリに関する知識を随時学習できる. ツール: Collection Framework(集合フレームワーク)はjava.utilパッケージに組み込まれており、集合を表し、操作するための統一されたアーキテクチャであり、集合を詳細を表す操作から独立した操作を行うことができ、プログラミングの負担を軽減し、効率と性能を向上させる. java.util.concurrentパッケージには、マルチスレッドのプログラミングタスクを簡素化するための高度なコンカレントツールと、より高度なコンカレント抽象を専門家が独自に作成できる低レベルのコンカレント基本タイプのコンカレントユーティリティのセットがあります.
第四十八条、正確な答えが必要な場合はfloatとdoubleの使用を避けてください floatとdoubleタイプは主に科学計算とエンジニアリング計算のために設計されている.これらは、広範な数値範囲でより正確な高速近似計算を提供するために丹念に設計されたバイナリ浮動小数点演算を実行する.しかし、それらは完全に正確な結果を提供していない.特に通貨計算には適用されず、floatとdoubleを0.1を正確に表すことは不可能である. BigDecimal、intまたはlongを使用して通貨計算を行います.システムに10進数小数点を記録させ、不便を気にしないようにするには、BigDecimalを使用します.パフォーマンスが特に重要で、10進数の小数点を自分で記録することを気にしない場合は、intとlongを使用します.数値が18桁を超える場合は、BigDecimalを使用する必要があります.
第四十九条基本タイプは梱包基本タイプより優先する javaには、2つの部分からなるタイプのシステムがあります.
基本タイプ(primitive):int、double、boolean、reference type:String、Listなどの参照タイプ.各基本タイプには、梱包基本タイプと呼ばれる対応する参照タイプがあります.(boxed primitive).int/double/booleanはInteger、Double、Booleanに対応しています.自動梱包と自動解体はぼやけていますが、基本タイプと梱包基本タイプの違いは完全に消去されていません.
の主な違い: 基本タイプは値のみであり、梱包基本タイプは値とは異なる同一性を有する. 基本タイプは機能完備の値のみであり、梱包基本タイプには非機能値nullがあります. 基本タイプは、通常、梱包基本タイプよりも時間とスペースを節約します.
箱詰めの基本タイプに==オペレータを使用すると、ほとんどエラーが発生します.1つの操作で基本タイプと梱包基本タイプを混合して使用すると、梱包基本タイプは自動的に解体され、nullオブジェクト参照が自動的に解体されると いつ箱詰めの基本タイプを使うべきですか? は、集合の要素、キー、値として、基本タイプを集合に配置することはできません.そのため、梱包基本タイプを使用する必要があります. パラメトリックタイプでは、パラメータタイプとして梱包基本タイプを使用する必要があります. 反射メソッド呼び出し時には、梱包基本タイプを使用する必要があります.
まとめ:選択可能な場合、基本タイプは梱包基本タイプより優先されます.基本タイプはより簡単で迅速です.梱包基本タイプを使用する必要がある場合は、自動梱包により梱包基本タイプを使用する煩雑さが軽減されますが、リスクは軽減されません.
第50条、他のタイプを使用するのが適切である場合、文字列の使用はできるだけ避ける文字列の利点:テキストを表すために使用され、非常に汎用的でJavaサポートが良い. 文字列を使用しない場合: 文字列は他の値の代わりに適していない.ファイル、ネットワーク、キーボードデバイスからプログラムに入ると、通常は文字列の形式で存在し、数値であれば適切な数値タイプに変換されるべきである. 文字列は代替列挙タイプに適していない:第30条 を参照文字列は集約タイプの代わりに適していません.1つのエンティティに複数のコンポーネントがある場合、文字列でこのエンティティを表すのは通常不適切です.より良い方法は、このデータセットを記述するためにクラスを作成することです.通常、プライベートな静的メンバークラスです. 文字列は代替コンピテンシーテーブルに適していません(capabilities):文字列は、ある機能へのアクセスを許可するために使用される場合があります.たとえば、スレッドのローカル変数を提供するメカニズムを設計することを考慮します.このメカニズムが提供する変数は、各スレッドに独自の値を持っています.数年前にこのような設計タスクに対して、顧客が提供した文字列キーを利用して、各スレッドのローカル変数の内容にアクセスする人もいます.権.
要するに、より適切なデータ型を使用することができ、またはより適切なデータ型を記述することができる場合は、文字列でオブジェクトを表すことを避けるべきである.基本タイプ、列挙タイプ、および集約タイプは、文字列で誤って置き換えられることが多い.
第五十一条、注意文字列接続の性能 許容可能な性能を得るためにStringの代わりにStringBuilderを使用してください.2つの方法の性能の違いは大きく、従来の方法ではコストが2乗増加し、改善後は線形に増加します. 要約:パフォーマンスが重要でない限り、文字列接続オペレータを使用して複数の文字列をマージしないでください.逆にStringBuilderのappendメソッドを使うべきです.
第46条、for-eachサイクルは従来のforサイクルより優先する
for(Iterator i = c.iterator();i.hasNext();){
doSomething((Element)i.next());
}
配列を巡回するプリファレンス: for(int i = 0 ; i < a.length ; i++){
doSomething(a[i]);
}
しかし、それらは完璧ではありません:反復器とインデックス変数はいくつかの混乱をもたらし、エラーの可能性を表しています.Java1.5 for-eachループを導入し、反復器またはインデックス変数を完全に隠すことで、混乱とエラーの可能性を回避します: for(Element e:elements){
doSomething(e);
}
コロンは..ここでは、要素elementsの各要素eについて読むことができます.これは性能的に少し優位かもしれません. public interface Iterable{
Iterator iterator();
}
第47条クラスライブラリの理解と使用
第四十八条、正確な答えが必要な場合はfloatとdoubleの使用を避けてください
第四十九条基本タイプは梱包基本タイプより優先する
基本タイプ(primitive):int、double、boolean、reference type:String、Listなどの参照タイプ.各基本タイプには、梱包基本タイプと呼ばれる対応する参照タイプがあります.(boxed primitive).int/double/booleanはInteger、Double、Booleanに対応しています.自動梱包と自動解体はぼやけていますが、基本タイプと梱包基本タイプの違いは完全に消去されていません.
NullPointerException
が得られます.第50条、他のタイプを使用するのが適切である場合、文字列の使用はできるだけ避ける
第五十一条、注意文字列接続の性能
+
(文字列接続オペレータ)は、複数の文字列を1つの文字列に結合する便利な方法です.1行の出力を生成したり、小さいサイズの固定されたオブジェクトを表す文字列を構築したりするには、+を使用するのが適切です.しかし、大規模なシーンでn文字列を接続するために文字列接続操作を繰り返すのは適切ではありません.文字、nの平方級の時間を必要とします.文字列が可変でないため、2つの文字列が接続されている場合、それらの内容はコピーされます. public String statement(){
StringBuilder b = new StringBuilder(numItems() *LINE_WIDTH);
for(int i = 0; i< numItems();i++){
b.append(lineForItem(i));
}
return b.toString();
}
元: public String statement(){
String result = "";
for (int i = 0;i < numItems(); i++){
result += lineForItem(i);
}
return result;
}