bugfix> java > 投稿

元気です。

この投稿は、データベース情報を取得するときに@SuppressWarnings( "unchecked")を使用する際のパフォーマンスの考慮事項に関するものです。会社のリードに質問がありましたが、灰色の領域のようです。例は次のとおりです。

シナリオ1:

public List<BusinessObject> retrieveInformation(Long id){
    List<? extends Object> info = persistenceService.get("namedQuery", params, values);
    //... cast the contents one by one to List<BusinessObject> and return
}

シナリオ2:

public List<BusinessObject> retrieveInformation(Long id){
    List<?> info = persistenceService.get("namedQuery", params, values);
    //... cast the contents one by one to List<BusinessObject> and return
}

シナリオ3:

public List<BusinessObject> retrieveInformation(Long id){
    List<BusinessObject> info = (List<BusinessObject>)persistenceService.get("namedQuery", params, values);
    //... return the List<BusinessObject>
}

シナリオ4:

@SuppressWarnings("unchecked") 
public List<BusinessObject> retrieveInformation(Long id){
    List<BusinessObject> info = persistenceService.get("namedQuery", params, values);
    //... return the List<BusinessObject>
}

もちろん、これを行う方法は他にもたくさんありますが、私の懸念は、このプロセスを最高のパフォーマンスで行う方法です。 そのため、情報の取得中にクエリに誤りがあり、例外が発生する可能性があることを考慮する必要があります。また、そのような間違いがない場合、取得されるオブジェクトのタイプはすでにわかっています。

だから、これを大企業のプロジェクトの観点から考えて、すべてのコンポーネント、たとえば休止状態のレイヤー、DAO、DTOを配置して、私が判断するのを手伝ってください:

  1. 最高のパフォーマンスを考慮した1つのオプション。
  2. @SuppressWarnings( "unchecked")アノテーションにパフォーマンスの考慮事項がある場合。
  3. この範囲では、@ SuppressWarnings( "unchecked")を削除することをお勧めします。

ごきげんよう。

回答 2 件
  • 私の知る限り、 @SuppressWarnings  注釈はパフォーマンスに影響しません。生成されるバイトコードを実質的に変更することはありません。

    ソースコード内の不必要な型キャストはバイトコードコンパイラによって省略されるべきですが、コンパイラは、警告の抑制に関係なく、実行時の型の安全性を確保するために必要なすべての型キャストを含めます1

    さらに、(仮に)コンパイラが厳密に必要ではない型キャストバイトコードを挿入する場合、すべき JITコンパイラーによって最適化されます。


    ただし、 @SuppressWarnings を使用する必要がないようにコードを記述する方が良い  注釈。問題は、注釈によってコード内の論理エラーが隠される可能性があることです。つまり、警告は本物である可能性があります。完全なユニットによって検出されない場合そして 統合テストでは、これらは予期しないランタイムエラーにつながる可能性があります。


    1-コンパイラがこれを行わなかった場合、バイトコードはJVMによってロードされたときに検証に失敗します。

  • @SuppressWarningsはコンパイラーにのみ影響し、コンパイラーが警告を表示しないようにします。

    ジェネリックリストに割り当てるとき、コンパイラが型の互換性を検証する機会を得ることだけが行われます。実行時に、ジェネリック情報は消去されます。

    シナリオ3は、コード品質の観点から、呼び出しからリストを取得していると仮定した場合の最善の策です。 4つのシナリオはすべて同じ出力を生成します。

あなたの答え