2015-09-28 2 views
0

Какие из перечисленных ниже вы бы предпочли:Различные дизайнерские решения с тем, если-иначе-заявления

SomeEnum enum = SomeEnum.SOMETHING; 
    if (aString.equals(anotherString)) { 
     enum = SomeEnum.SOMETHING_ELSE; 
    } 
    return foo.bar(enum); 

или

if (aString.equals(anotherString)) { 
     return foo.bar(SomeEnum.SOMETHING_ELSE); 
    } 
    return foo.bar(SomeEnum.SOMETHING); 

Я думаю, что я предпочел бы первый, потому что он имеет только 1 очко возврата. С другой стороны, я думаю, что второй легче читать. Как вы думаете? Возможно, у вас есть еще более сложное решение.

+2

Я лично использовал бы дополнительную локальную переменную, но с условным оператором: 'SomeEnum x = aString.equals (anotherString)? SomeEnum.SOMETHING_ELSE: SomeEnum.SOMETHING; return foo.bar (x); 'Не добавляя это в качестве ответа, поскольку это действительно вопрос мнения. –

+0

Планируете ли вы иметь несколько перечислений или код, о котором идет речь, единственный вариант использования, который у вас есть для этого? – christopher

+1

Несколько перечислений? Я просто говорю об одном перечислении здесь, и это «SomeEnum». – Chris311

ответ

3

Это зависит от того, сколько элементов мы говорим о:

Для большого перечисления, я хотел бы сохранить карту от строки к ENUM объекта. И я бы посмотрел элемент на карте и предоставил SomeEnum.SOMETHING по умолчанию.

public SomeEnum get(String key, SomeEnum defaultValue){ 
    SomeEnum value = this.map.get(key); 
    return value == null ? defaultValue : value; 
} 

Для меньшего количества деталей, я бы, вероятно, пойти с переключателем заявления:

public SomeEnum get(String key, SomeEnum defaultValue){ 
    switch(key){ 
     case "somevalue1" : return SomeEnum.SOME_VALUE_1; 
     case "somevalue2" : return SomeEnum.SOME_VALUE_2; 
     default: return defaultValue; 
    } 
} 

Но если это на самом деле только два случая, упомянутые в этом вопросе, я бы с

return aString.equals(anotherString) ? SomeEnum.SOMETHING_ELSE : SomeEnum.SOMETHING; 
+0

Учитывая, что вам понадобится дополнительная работа, чтобы проверить, требуется ли по умолчанию, кажется, слишком сложно создать карту для значения * one *. –

+0

Субъективный вопрос, но это, безусловно, объективно лучший ответ. – christopher

+2

@christopher: Я не вижу, как это объективно * лучше. Какие именно объективные критерии используются здесь? –

0

Это не имеет большого значения. Упрощения, подобные этим, вероятно, будут оптимизированы компилятором! Вы должны использовать все, что делает ваш код более читаемым!

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