有没有办法在没有做任务的情况下进行java三元操作或假装分配?
我喜欢简单的三元代码在做一堆if / then / elses时看起来如何。
我希望能够根据布尔代数语句调用两个void函数之一。
类似的东西:
(bool1 && bool2) ? voidFunc1() : voidFunc2();
我的函数是返回类型void
,所以如果有一种方法可以在赋值中伪造它以使其正常工作,那么我就可以了...我想看看怎么做虽然:)
答案 0 :(得分:18)
不,你不能这样做。 spec says so。
条件运算符有三个操作数表达式。 ?出现 在第一个和第二个表达式之间,和:出现在 第二和第三个表达。
第一个表达式必须是boolean或Boolean类型,或者是a 发生编译时错误。
第二个或第三个操作数是编译时错误 表达式是对 void 方法的调用。
[编辑]
既然你问了反思,这是一个解决方案。我不推荐这个。我发帖只是因为你问过。
public class MyCall
{
public void a(){System.out.println("a");}
public void b(){System.out.println("b");}
public static void main(String... args)
{
new MyCall().go();
}
public void go()
{
Class<? extends MyCall> class1 = this.getClass();
Method aMethod = class1.getMethod("b", null);
Method bMethod = class1.getMethod("a", null);
Object fake = false ? aMethod.invoke(this, null) : bMethod.invoke(this, null);
Object fake2 = true ? aMethod.invoke(this, null) : bMethod.invoke(this, null);
}
}
在一天结束时,你必须问自己是否提高了代码的可读性(想想 - 每个循环)。这些解决方案都没有提高代码的可读性恕我直言。如果我是你,我宁愿选择这个。
if(condition)
a();
else
b();
我实际上 包括大括号,即使循环只包含一行,但由于你需要使用清晰的代码,所以上面的代码段应该可以。
答案 1 :(得分:8)
不,你不能这样做。
如果不喜欢这种风格,你可以选择这种风格。
if(bool1 && bool2) voidFunc1(); else voidFunc2();
在三元运算符中,操作数必须是非void表达式;即他们必须产生一些实际价值。
答案 2 :(得分:1)
如果你真的想要使用ternany操作,那么就有一个hack。 但这是非常糟糕的代码,仅用于显示语言能力。 我永远不会建议将这些代码投入生产,甚至不向朋友展示。
int dummy = (bool1 && bool2) ? new Object(){
public int hashCode() {
yourFunction1();
// ...
yourFunctionN();
return 0;
};
}.hashCode() : new Object(){
public int hashCode() {
yourAnotherFunction1();
// ...
yourAnotherFunctionN();
return 0;
};
}.hashCode();
答案 3 :(得分:1)
有没有办法在不进行任务或伪造作业的情况下进行java三元操作?
好的,所以当你写这样的声明时:
(bool1 && bool2) ? voidFunc1() : voidFunc2();
代码存在两个明显的问题:
条件表达式 1 的第2和第3个操作数不能调用void方法。参考:JLS 15.25。
表达式不是语句,除非它是赋值表达式或方法调用或对象创建。参考:JLS 14.8。
实际上,第二个问题是语法错误,我希望任何主流Java编译器都能报告它而不是第一个问题。如果你做了这样的事情,第一个问题只会显露出来:
SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2();
或
gobble((bool1 && bool2) ? voidFunc1() : voidFunc2());
其中gobble
是一个什么都不做的方法......除了“消耗”其参数的值。
AFAIK,没有可以接受原始表达的上下文。
1 - “条件表达式”是Java语言规范中用于此构造的主要术语。它在Oracle Java Tutorial中称为“三元条件运算符”。