Java三元运算符黑科技

3

所以我在这里并不追求可维护性或优雅性...只是想找到一种减少方法中总令牌的方法。该方法由长嵌套 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”成为布尔值而不需要括号?


19
你应该被解雇...并被从大炮中发射到太阳里。 - Kevin
3
三元运算符很不错,但代码可维护性应该更加重要。我为那些需要维护你的代码的人感到难过...即使是你自己。如果你离开这个项目并在一个月后回来,你会后悔用三元表达式编写它。 - Keith Adler
2
夸赞你在这个问题上使用了“黑客”标签... - Michael Easter
3
你不应该优化代码来迎合编译器(以最少的标记为便宜),而是优化给需要维护代码的人看。我建议你可以尝试写易于维护的代码,"玩乐"地写(或者尝试一种更简洁的语言)。我知道你说你不在意,但真正的程序员不会通过减少字符数量来获得更好的解决方案,因为我们不是这样优化的。而且,实际上这并不是一个有趣的问题;它只会让我感到不舒服。 - Ryan Emerle
4
由于secondbanana只是为了好玩而试图削减代币,我认为我们可以跳过一般情况下为什么这是个坏主意的讨论。我猜他已经知道了。 - David Thornley
显示剩余4条评论
2个回答

2
(field = value) instanceof String

假设它已经满足您的需求(因此包括在valuenull时返回false),则更短的替代方法如下:
(field = value) != null

如果您实际上忽略了这一点,并希望使 null 也返回 true,那么请使用

(field = value) == value

如果您使用1字母变量名,这可以大大缩短。

此外,我没有看到其他方法,并且我同意我们中的大多数人认为这些都有点令人讨厌;)


实际上有一个程序来评估我们的工作,并将每个字符串和每个标点符号都视为一个标记。所以"instanceOf String"是两个标记,"!= null"是三个标记。如果有一种不需要在"field = value"周围加括号的结构,那就太好了。 - daltonb
我不同意!=算两个。从技术上讲,它只是一个运算符。 - BalusC
嗯,我刚刚检查了一下,程序实际上将“!=”视为一个计数。 - daltonb
确实可以不加括号编译通过,但你实际上需要它们!否则它会错误地评估 field = (value != null)!= 的优先级高于 = - BalusC

2

如果参数为空,则返回 0。
然后对参数进行 case/switch/select 语句,这是一种简洁的方法。


1
我认为他并不想要“干净”的代码(对于未来的维护开发人员来说这是不幸的)。 - FrustratedWithFormsDesigner
2
你不能对一个字符串执行开关操作。 - mtpettyp
就像mtpettyp所说,你不能对一个字符串进行开关操作,因此这并没有帮助。 - daltonb
对于这个程序的规模来说,使用枚举可能不太节省标记。 - daltonb
2
@FrustratedWithFormsDesigner:如果你从问题的表述中认为会有“未来维护开发人员”在这个“代码库”上工作,那么我想尝一点你吸的东西,因为它看起来很重。 - SyntaxT3rr0r
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接