Ява троичный хак - PullRequest
       8

Ява троичный хак

3 голосов
/ 08 февраля 2010

Так что я не собираюсь обслуживать или элегантность здесь ... ищу способ сократить общее количество токенов в методе просто для удовольствия. Метод состоит из длинной вложенной конструкции 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» - это три. Основными вещами, которые я вижу для возможного улучшения, являются "&&" и скобки. Есть ли способ поместить «поле = значение» где-то помимо условного, и если нет, то есть ли конструкция, которая делает «поле = значение» логическим без необходимости в скобках?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2010
(field = value) instanceof String

Если предположить, что он уже удовлетворяет вашим потребностям (и, таким образом, он включает в себя возврат false, когда value равен null), тогда более короткая альтернатива была бы

(field = value) != null

Или, если вы на самом деле упустили это из виду и хотите null вернуть true, используйте

(field = value) == value

Это можно сделать намного короче, если вы используете 1-буквенные имена переменных.

Кроме того, я не вижу других путей и согласен с большинством из нас, что все это несколько мерзко;)

2 голосов
/ 08 февраля 2010

если параметр равен нулю, вернуть 0
Затем сделайте оператор case / switch / select для параметра. Это чистый .

...