2011-06-15 15 views
0

ブール式(getSupercategories())のために潜在的に高価なメソッドを呼び出すのは良いスタイルではないと言われました。同様に、それが(itemはこのクラスのパブリックメソッドへのパラメータとして送信され、病棟後に送信されるローカル・データ・メンバーから来ていない可能性があります関連属性によって裏打ちされていますので、getSupercategories()が潜在的に危険であることをリファクタリングに最適なアプローチこのJavaスニペット

private final SuperCategoriesResolver<ProductModel> catResolver = new SuperCategoriesResolver<ProductModel>() { 
    @Override 
    public Set<CategoryModel> getSuperCategories(final CategoryModel item) { 
     return item == null || item.getSupercategories() == null ? Collections.EMPTY_SET 
       : new LinkedHashSet<CategoryModel>(
         item.getSupercategories()); 
    } 
}; 

catResolverと宣言するときに同じクラスでオーバーライドされるgetSuperCategories())。

これは、上記の議論に取り組むためのより良いアプローチですか?私が最初にitemnullではないことを確認し

private final SuperCategoriesResolver<ProductModel> catResolver = new SuperCategoriesResolver<ProductModel>() { 
    @Override 
    public Set<CategoryModel> getSuperCategories(final ProductModel item) { 
     if (item != null) { 
      Set<CategoryModel> superCategories = (Set<CategoryModel>) item 
        .getSupercategories(); 

      if (superCategories != null) 
       return superCategories; 
     } 

     return Collections.EMPTY_SET; 
    } 
}; 

。そうであれば返すempy_set私は高価なメソッドを呼び出して、コレクションを取得し、ちょうどそれがない場合null要素でコレクションを返します。

ありがとうございました。

答えて

0

getSupercategories()を計算すると2回ではなく1回呼び出す方が効率的になる可能性があります。

このセットのコピーを返す必要がありますか?あなたは最初の例ではありますが、2番目の例では行いません。

+0

これは私が2番目のアプローチで試したものです。この1つはより良いアプローチであると思われますか、改善できるものがありますか? – Bartzilla

+0

2つ目の方法が良いかもしれませんが、結果のコピーを返す必要があるかどうかを判断する必要があります。 –

+0

私は天気を決定したいgetSupercategories()はnullを返さないので、私は一度呼び出された後にコピーを返しません。 getSupercategories()を呼び出す代わりにnullをチェックしてからgetSupercategories()を呼び出して戻り値を返します。 – Bartzilla

0

itemがnullでない場合、getSupercategoriesメソッドを呼び出す呼び出しが1つしかないため、2番目の方法は実際には高速です。しかし、2番目のアプローチでは、LinkedHashSetインスタンスを作成しなくなります。つまり、動作は異なります(高速ですが)。

リファクタリングとは異なり、パフォーマンスの最適化に似ています。通常、あなたが何かをリファクタリングするとき、そこには、冗長性を排除することによってコードをトリミングする「要因」があります。

0

ヌルが問題です。 nullを押しのけるリファクタリングはできますか?

たとえば、item.getSuperCategoriesがnullを返さないようにコードをリファクタリングすることはできますか?または空のセットとnullを区別する必要がありますか?

同様に、なぜこのメソッドにnullを渡していますか?そのシナリオを排除できれば、コードはちょうど1つのライナーになります。

関連する問題