「EffectiveJava2nd」第7章メソッド

目次

第38条パラメータの有効性を確認する

第39条必要に応じて保護コピー

第40条メソッドシグネチャを注意深く設計する

第41条過負荷の使用には注意が必要です

第42条変数パラメータの使用には注意が必要です

第43条は、nullではなく長さがゼロの配列またはコレクションを返します

第44条エクスポートされたすべてのAPI要素のドキュメントノートを作成する


焦点:使いやすさ、堅牢性、柔軟性

第38条パラメータの有効性を確認する

メソッドまたはコンストラクターを作成するときは、パラメーターの制限を考慮し、明示的にチェックする必要があります

 

第39条必要に応じて保護コピー

クラスにクライアントから取得した、またはクライアントに返された可変コンポーネントがある場合、不変性を維持するために、必要に応じて保護コピーが作成されます。

それ以外の場合は、このコンポーネントを変更できないことがドキュメントに記載されています。

例えば:

コードをコピーする

public final class Period {
   private final Date start;
   private final Date end;
   public Period(Date start, Date end) {
      if (start.compareTo(end) > 0) {
         throw new IllegalArgumentException(strat + "after" + end);
      }
      this.start = start;
      this.end = end;
   }
   public Date start() {
      return start;
   }
   public Date end() {
      return end;
   }
}

コードをコピーする

期間は不変の期間を表します。

ただし、期間は不変ではありません!日付は可変であるため。

Date start = new Date();
Date end = new Date();
Period p = new Period(strat, end);
end.setYear(78);//因为Date是可变的,导致p被修改了

解決:

コードをコピーする

public Period(Date start, Date end) {
      //先进行保护性拷贝,然后再对拷贝后的进行检查
      this.start = new Date(start.getTime()); //使用保护性拷贝
      this.end = new Date(end.getTime()); //使用保护性拷贝
      if (this.start.compareTo(this.end) > 0) {
         throw new IllegalArgumentException(strat + "after" + end);
      }
   }

コードをコピーする

期間は変更できます。

Date start = new Date();
Date end = new Date();
Period p = new Period(strat, end);
p.end().setYear(78);//因为Date是可变的,导致p被修改了

解決:

   public Date start() {
      return new Date(start.getTime());
   }
   public Date end() {
      return new Date(end.getTime());
   }

 

第40条メソッドシグネチャを注意深く設計する

1.長いパラメータリストは避けてください。4パラメータ以下。

同じタイプの長いパラメータシーケンスを定義しないでください。誤ってパラメータの順序を間違えやすくなります。

長いパラメータリストを短くする方法は?

1)複数の方法に分割する

2)パラメータのグループ化を保存するための補助クラスを作成します。

3)ビルダーモードを採用します。このメソッドは、メソッドに複数のパラメーターがあり、それらの一部がオプションである場合に特に役立ちます。

 

2.パラメータタイプの場合、クラスよりもインターフェイスが優先されます。

 

3.ブール型の場合、2つの要素の列挙型が推奨されます

 

第41条過負荷の使用には注意が必要です

なぜオーバーロードを注意して使用するのですか?

特別な状況(型変換、自動ボックス化およびボックス化解除など)では、どのオーバーロードされたメソッドが呼び出されるかを決定するのが難しいためです。

提案する

1)同じ数のパラメータを持つ複数のメソッドの場合、オーバーロードは可能な限り回避する必要があります。

2)この状況を回避するには、型変換後にのみ、同じパラメーターのセットを異なるオーバーロードされたメソッドに渡すことができます。

举例:m(List <?> s)、m(Set <?> s)、m(Collection <?> s)。

 

第42条変数パラメータの使用には注意が必要です

パフォーマンスが重要な場合は、変数パラメーターを慎重に使用してください。変数パラメーターを呼び出すたびに、配列の割り当てと初期化が行われます。

改善方法?呼び出しの95%に3つ以下のパラメーターがあると判断された場合は、5つのオーバーロードされたメソッドを定義します。

m()

m(int a)

m(int a、int b)

m(int a、int b、int c)

m(int a、int b、int c、int .... rest)

 

第43条は、nullではなく長さがゼロの配列またはコレクションを返します

戻り値の型が配列またはコレクションであるメソッドの場合、nullを返す代わりに、長さがゼロの配列またはコレクションを返します。

 

第44条エクスポートされたすべてのAPI要素のドキュメントノートを作成する

おすすめ

転載: blog.csdn.net/hanhan122655904/article/details/114369323
おすすめ