2011-06-15 3 views
0

Мне сказали, что это не хороший стиль для вызова потенциально дорогостоящих методов для булевых выражений (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()); 
    } 
}; 

Как хорошо, что getSupercategories() является потенциально опасным, так как он опирается на атрибут отношения, которые не могут быть наступающим из местных элементов данных (item передаются в качестве параметра общедоступного метода в этом классе, и после того, как подопечные отправляются getSuperCategories(), который переоценивается в том же классе при объявлении catResolver).

Это лучший подход к решению вышеприведенного аргумента?

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; 
    } 
}; 

Где я сначала проверить, что item не null. если это так, то возвращается empy_set, если нет, то я назвал дорогостоящий метод и получаю коллекцию, и если это не null, верните коллекцию с элементами.

Благодарим вас за советы.

ответ

0

Скорее всего, более эффективный вызов getSupercategories() один раз вместо двух, если он выполняет какие-либо вычисления.

Вам нужно вернуть копию этого набора? Вы делаете это в первом примере, но не во втором.

+0

Это то, что я пробовал на втором подходе. Кажется ли это, что это лучший подход или есть что-то, что можно улучшить? – Bartzilla

+0

Второй подход может быть лучше, но вам нужно определить, нужно ли возвращать копию результата или нет. –

+0

Я хочу определить погоду getSupercategories() не возвращает значение null, поэтому я вызвал один раз, а затем, если не вернул копию; вместо вызова getSupercategories() проверьте не null, а затем снова вызовите getSupercategories() и верните, что не является хорошим подходом, поскольку это дорогостоящий метод. – Bartzilla

0

Второй подход действительно быстрее, потому что есть только один вызов метода getSupercategories, если элемент не равен null. Однако в вашем втором подходе вы больше не создаете экземпляр LinkedHashSet, что означает, что он будет вести себя по-другому (хотя и быстрее).

Это больше похоже на оптимизацию производительности, а не на рефакторинг. Обычно, когда вы реорганизуете что-то, есть «фактор» там где-то, что уменьшает код, устраняя избыточность.

0

Nulls - ваша проблема. Можете ли вы сделать рефакторинг для удаления нулей?

Например, вы можете реорганизовать свой код, чтобы сделать item.getSuperCategories никогда не возвращать null? Или вам нужно различать пустой набор и null?

Аналогичным образом, почему вы передаете null в этот метод? Если вы можете исключить этот сценарий, тогда код просто станет одним лайнером.

Смежные вопросы