java三元黑客

时间:2010-02-08 18:31:41

标签: java ternary-operator

所以我不会在这里寻求可维护性或优雅性......寻找一种方法来减少方法中的总代币只是为了好玩。该方法由一个长嵌套的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”,如果没有,是否有一个构造使“field = value”成为布尔值而不需要括号?

2 个答案:

答案 0 :(得分:2)

如果param为null,则返回0
然后在参数上创建一个case / switch / select语句。这是 clean

答案 1 :(得分:2)

(field = value) instanceof String

假设它已满足您的需求(因此它包括valuenull时返回false),那么更短的替代方案就是

(field = value) != null

或者,如果你真的忽略了这一点,并想让null同时返回true,那么请使用

(field = value) == value

如果使用1个字母的变量名,可以缩短它。

此外,我没有看到其他方式,我同意我们大多数人的观点,这一切都有些令人讨厌;)