java三元黑客
所以我这里不追求可维护性或优雅性。。寻找一种方法来减少方法中的总令牌数,只是为了好玩。该方法由一个长嵌套的if-else构造组成,我发现(我认为)用最少的标记来实现它的方法是三元运算符。基本上,我将其翻译为:java三元黑客,java,ternary-operator,Java,Ternary Operator,所以我这里不追求可维护性或优雅性。。寻找一种方法来减少方法中的总令牌数,只是为了好玩。该方法由一个长嵌套的if-else构造组成,我发现(我认为)用最少的标记来实现它的方法是三元运算符。基本上,我将其翻译为: String method(param) { if (param == null) return error0; else if (param.equals(foo1)) if (condition) return
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
}
然而,在一些情况下,除了返回一个值之外,我还想更改一个字段或调用一个方法;e、 g
else if (param.equals(foo3))
if (condition) {
field = value;
return bar3;
}
else
return error3;
做这件事最便宜的方法是什么?我现在所做的是丑陋的,但不会浪费太多的令牌(这里的字段是一个字符串):
再说一次,重点不是好的编码,我只是在寻找黑客来减少令牌计数。如果有一个较短的方式来写整件事,我也愿意。谢谢你的建议
编辑:每个单词和标点符号都算作一个标记。例如,“instanceOf String”是两个标记,但“!=null”是三个。我能看到的可能改进的主要方面是“&&”和括号。是否有办法将“field=value”放在条件之外的某个地方,如果没有,是否有一个构造使“field=value”成为布尔值而不需要括号?如果param为null,则返回0
然后对参数进行case/switch/select语句。那很干净 假设它已经满足了您的需求(因此当
value
为null
时,它包括返回false),那么一个较短的替代方案就是
(field = value) != null
或者,如果您实际上忽略了这一点,并且想要使null
返回true
,那么使用
(field = value) == value
如果使用1个字母的变量名,则可以大大缩短
此外,我看不到其他方式,我同意我们大多数人的看法,这一切都有点令人讨厌;) 你应该被发射…离开大炮,直射太阳。三元运算符很好,但是代码的可维护性应该优先考虑。我同情那些必须维护你的代码的人。。。即使是你。如果你离开这个问题,甚至一个月后再回来,你会后悔用三元表达式编码。在这个问题上使用“黑客”标记的荣誉……你不应该为编译器(最便宜的wrt标记)优化,而应该为需要维护它的人优化。我会练习编写可维护代码,“为了好玩”(或者尝试更简洁的语言)。我知道你说过你不在乎,但真正的程序员不会有一个字符更少的解决方案,因为我们不会这样优化。坦率地说,这甚至不是一个有趣的问题;因为secondbanana正试图减少代币的数量只是为了好玩,我想我们可以跳过关于为什么这是一个坏主意的讨论。我怀疑他已经知道了。我不认为他想要“干净”(对未来的维护开发者来说很不幸)。你不能打开字符串。如果你对字符串有“相等”条件,可能需要一个枚举来完成这项工作。@mtpettyp:在Java 7:@fructedWithForms中是允许的设计者:如果你从这个问题的表述方式考虑,将来会有“未来维护开发者”在这个“代码库”上工作,那么我想了解一下你正在抽的东西,因为它看起来很重。实际上有一个程序对我们的工作进行评分,并将每个字符串和标点符号作为标记进行计数。所以“instanceOf String”是两个标记,“!=null”是三个。如果有一个不需要在“field=value”周围加括号的结构就好了,我不同意
=代码>计数为2。从技术上讲,这是一个操作员。嗯,我刚刚检查了一下,这个程序实际上是算数的!=就像oneIt一样,它确实可以编译而不需要括号,但实际上您需要它们!否则它将错误地计算字段=(值!=null)
。=代码>的优先级高于=
。
(field = value) != null
(field = value) == value