OOP


1. [必須] クラスのオブジェクト参照を通じて、このクラスの静的変数または静的メソッドにアクセスすることは避けてください。これにより、コンパイラによる スクリプトへの解析の数が不必要に増加します。これらに直接アクセスするには、クラス名を使用してください。


#2. [必須] すべてのオーバーライド メソッドには @Override アノテーションを付ける必要があります。

反例: getObject() と get 0 bject() の問題。 1 つは文字の O で、もう 1 つは数字の 0 です。オーバーライドが成功したかどうかを正確に判断するには、@Override

を追加します。さらに、メソッド シグネチャが抽象クラスで変更された場合、その実装クラスはすぐにコンパイルしてエラーを報告します。


#3. [必須] Java 変数パラメータは、同じパラメータ タイプおよび同じビジネス上の意味を持つ場合にのみ使用できます。オブジェクトの使用は避けてください。

注: 可変パラメータはパラメータ リストの最後に配置する必要があります。 (学生は可能な限り変数パラメータのプログラミングを避けることをお勧めします)

良い例: public User getUsers(String type, Integer... ids)

4. [必須] の署名外部に公開されるインターフェイス。インターフェイスの呼び出し元への影響を避けるため、原則としてメソッド シグネチャの変更は許可されません。 @Deprecated アノテーションは、インターフェースが古く、明らかに


の場合に追加する必要があります。

#33 は

##[ で、採用された新しいインターフェイスまたは新しいサービスについて説明します。


#5. 【必須】古いクラスやメソッドは使用できません。

説明:

java . net . URLDecoder のメソッド decode(String encodeStr) は廃止されました。代わりに、2 つのパラメータの decode(String source, String encode) を使用する必要があります。インターフェイス プロバイダーは明らかに廃止されたインターフェイスであるため、

は同時に新しいインターフェイスを提供する義務があり、呼び出し側として、廃止されたメソッドの新しい実装を検証する義務があります。

6. [必須] Object のequals メソッドは null ポインタ例外をスローする傾向があるため、定数または特定の値を持つオブジェクトを使用する必要があります。

と等しいと呼び出します。

肯定的な例:
" test " .equals(object);

反例: ### object.equals( " test " );### ######注: ###java . util . Objects # と等しい (JDK 7 で導入されたツール クラス) ###############7. [必須] 】 同じ型のラッパークラスオブジェクト間の値の比較はすべてequalsメソッドを使用して行われます。 ###

注: -128 から 127 までの Integer var =? 代入では、Integer オブジェクトが IntegerCache . キャッシュに生成され、既存のオブジェクトが再利用されます。この範囲の整数の値は、 は == を使用して直接判断できますが、この範囲外のデータはすべてヒープ上に生成され、既存のオブジェクトは再利用されません。これは大きな落とし穴です。これをお勧めします。判定にはequalsメソッドを使用します。


8. [必須] 基本データ型およびパッケージ化データ型の使用基準は次のとおりです:

1) すべての POJO クラス属性ラッパー データ型を使用する必要があります。

2) RPC メソッドの戻り値とパラメーターは、ラップされたデータ型を使用する必要があります。

3) すべてのローカル変数 [推奨] は基本データ型を使用します。

注: POJO クラス属性には初期値がありません。これを使用する必要がある場合は、

## を避けるためにユーザー自身が明示的に値を割り当てる必要があることをユーザーに知らせます。 #NPE の問題または保管。検査はすべてユーザーによって保証されます。

良い例: 基本的なデータ型では自動的にボックス化解除され、NPE リスクが発生するため、データベースのクエリ結果が null になる可能性があります。

反例: たとえば、総トランザクション量の増減、つまりプラスまたはマイナス x % を表示します。x は基本データ型で、RPC サービスは呼び出し が失敗した場合、デフォルト値のページ表示: 0% が返されますが、これは不当であり、ダッシュ - として表示される必要があります。したがって、ラップされた データ型の null 値は、リモート呼び出しの失敗や異常終了などの追加情報を表すことができます。


9. 【必須】DO / DTO / VO などの POJO クラスを定義する場合、属性のデフォルト値を設定しないでください。

反例: POJO クラスの gmtCreate のデフォルト値は new Date(); ただし、他のデータを更新する場合、この属性には特定の

値がありません。このフィールドはフィールドの追加時に更新されたため、作成時刻が現在の時刻に変更されました。


10. [必須] シリアル化クラスに新しい属性を追加するときは、 がアップグレードと完全に互換性がない場合、逆シリアル化の失敗を避けるために、serialVersionUID フィールドを変更しないでください。逆シリアル化が混乱を招くことを避けてください。その場合は、serialVersionUID 値を変更してください。

注: serialVersionUID が一貫していない場合、シリアル化ランタイム例外がスローされることに注意してください。


11. 【必須】構築メソッド内にビジネスロジックを追加することは禁止されており、初期化ロジックがある場合はinitメソッド内に記述してください。


12. [必須] POJO クラスは toString メソッドを記述する必要があります。 IDE ツールを使用する場合:source >generate toString、別の POJO クラスを継承する場合は、先頭に super . toString を必ず追加してください。

注: メソッドの実行中に例外がスローされた場合、POJO の toString() メソッドを直接呼び出してその属性値を出力できます。これは、トラブルシューティングに便利です


13. 【推奨事項】Stringのsplitメソッドで取得した配列にindexを使用してアクセスする場合、最後の区切り文字以降にの内容があるかどうかを確認する必要があります。 IndexOutOfBoundsException がスローされるリスクがあります。

手順:

String str = "a,b,c,,";
String[] ary = str.split(",");
//预期大于 3,结果是 3
System.out.println(ary.length);


14. [推奨事項] クラスに複数のコンストラクター、または複数のメソッドが含まれる場合同じ名前の場合、読みやすいように、これらのメソッドを の順序でまとめて配置する必要があります。


15. [推奨] クラス内のメソッドの定義順序は、 public メソッドまたは protected メソッド > private メソッド > getter / setter メソッドです。 。

説明: パブリック メソッドは、クラスの呼び出し元と管理者が最も関心のあるメソッドであり、最初の画面に表示されるのが最適ですが、保護されたメソッドは関心があるだけです。サブクラス に対しても、これは「テンプレート デザイン モード」のコア メソッドである可能性があり、プライベート メソッドの外側は通常、特別な注意を必要とせず、 ブラック ボックス実装です。メソッド情報の価値が低いため、Service および DAO のすべての getter/setter メソッドをクラス本体の最後に配置します。


16. [推奨] setter メソッドでは、パラメータ名はクラスのメンバ変数名と一致している必要があります (this. メンバ名 = パラメータ名)。

getter/setter メソッドでは、ビジネス ロジックを追加してトラブルシューティングの難易度を高めないようにしてください。

カウンター例:

public Integer getData(){
if(true) {
return data + 100;
} else {
return data - 100;
}
}


17. [推奨] StringBuilder の append メソッドを使用してループ本体の文字列を接続します。 。

カウンター例:

String str = "start";
for(int i=0; i<100; i++){
str = str + "hello";
}

説明:

逆コンパイルされたバイトコード ファイルは、各ループが新しい StringBuilder オブジェクトを作成してから続行することを示しています append 操作を実行し、最後に toString メソッドを通じて String オブジェクトを返すため、メモリ リソースが無駄に消費されます。


18. 【推奨】final を使用すると、プログラムの応答効率が向上します。クラス属性やローカル変数などを再割り当てする必要があります。

2) object パラメーターの前に Final を追加して、参照点の変更が許可されていないことを示します。

3) クラスメソッドをオーバーライドしてはなりません。

19. [推奨] オブジェクトの clone メソッドを使用してオブジェクトをコピーする場合は注意してください。

注:

オブジェクトの clone メソッドはデフォルトで浅いコピーになります。深いコピーを実装したい場合は、clone メソッドをオーバーライドして属性オブジェクトのコピーを実装する必要があります。

20. [推奨事項] クラスのメンバーとメソッドへの厳密なアクセス制御:

1) new を使用して外部オブジェクトを直接作成できない場合、コンストラクターはプライベートである必要があります。

2) ツール クラスにはパブリックまたはデフォルトのコンストラクターを含めることはできません。

3) クラスの非静的メンバー変数およびサブクラスと共有される変数は保護する必要があります。

4) クラスの非静的メンバー変数はこのクラスでのみ使用され、プライベートである必要があります。

5) クラスの静的メンバー変数がこのクラスでのみ使用される場合は、プライベートである必要があります。

6) 静的メンバー変数の場合は、それが最終的な変数であるかどうかを考慮する必要があります。

7) クラス メンバーのメソッドはクラス内でのみ呼び出され、プライベートである必要があります。

8) クラス メンバーのメソッドは継承されたクラスに対してのみパブリックであるため、保護されたものに制限されます。

注: クラス、メソッド、パラメータ、または変数のアクセス範囲は厳密に制御されます。アクセス範囲が広すぎると、モジュールの分離には役立ちません。感想: プライベートメソッドであれば削除しても構いませんが、パブリックサービスメソッドやパブリックメンバー変数であれば削除すると、少し手のひらに汗をかきますか?変数は自分の子供のようなものなので、自分の目の届くところに置いておくようにしましょう。変数の範囲が広すぎて、無制限に走り回ると心配になります。