Вопрос
Так что я не гонюсь за ремонтопригодностью или элегантностью..ищу способ сократить общее количество токенов в методе просто для развлечения.Этот метод состоит из длинной вложенной конструкции if-else, и я обнаружил, что (я думаю) способ сделать это с наименьшим количеством токенов — это тернарный оператор.По сути, я перевожу это:
String method(param) {
if (param == null)
return error0;
else if (param.equals(foo1))
if (condition)
return bar1;
else
return error1;
else if (param.equals(foo2))
if (condition)
return bar2;
else
return error1;
...
else
return error;
}
к этому:
String method(param) {
return
param == null ?
error0 :
param.equals(foo1) ?
condition ?
bar1 :
error1 :
param.equals(foo2) ?
condition ?
bar2 :
error2 :
...
error
}
Однако есть несколько случаев, когда помимо возврата значения мне также нужно изменить поле или вызвать метод;например.,
else if (param.equals(foo3))
if (condition) {
field = value;
return bar3;
}
else
return error3;
Какой был бы самый дешевый способ сделать это с точки зрения токена?То, что я делаю сейчас, уродливо, но не тратит слишком много токенов (здесь поле представляет собой строку):
param.equals(foo3) && (field = value) instanceOf String ?
condition ?
bar2 :
error2 :
Опять же, дело не в хорошем кодировании, я просто ищу хаки, чтобы уменьшить количество токенов.Если есть более короткий способ написать все целиком, я тоже открыт для этого.Спасибо за любые предложения.
Редактировать:Каждое слово и знак препинания считаются за один токен.Так, например, «instanceOf String» — это два токена, а «!= null» — три.Основные вещи, которые я вижу для возможного улучшения, - это «&&» и круглые скобки.Есть ли способ поместить «поле = значение» где-нибудь помимо условного, и если нет, существует ли конструкция, которая делает «поле = значение» логическим без необходимости использования круглых скобок?
Решение
(field = value) instanceof String
Предполагая, что он уже удовлетворяет ваши потребности (и, следовательно, включает возврат false, когда value
является null
), тогда более короткой альтернативой было бы
(field = value) != null
Или если вы действительно упустили это из виду и хотите сделать null
возвращаться true
также, затем используйте
(field = value) == value
Это можно сделать намного короче, если использовать однобуквенные имена переменных.
Дальше других путей я не вижу и согласен с большинством из нас, что это все несколько противно ;)
Другие советы
если параметр равен нулю, верните 0
Затем выполните оператор case/switch/select для параметра.Это чистый .