没有赋值的Java三元组

有没有办法在没有做任务的情况下进行java三元操作或假冒伪造?

我喜欢做一堆if / then / elses时简洁的三元代码看起来如何。

我希望能够基于布尔代数语句调用两个void函数之一。

就像是:

(bool1 && bool2) ? voidFunc1() : voidFunc2();

我的函数是返回类型为void ,所以如果有一种方法可以在赋值中伪造它以使其工作,那么我对此很好……我想看看如何做到这一点:)

不,你不能这样做。 规范是这样说的 。

条件运算符有三个操作数表达式。 ? 出现在第一个和第二个表达式之间,并且:出现在第二个和第三个表达式之间。

第一个表达式必须是boolean或Boolean类型,否则会发生编译时错误。

第二个或第三个操作数表达式是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 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(); 

我实际上是为了包括括号,即使循环只包含一行,但由于你需要使用清晰的代码,所以上面的代码段应该可以。

不,你不能这样做。

如果不喜欢这种风格,你可以更喜欢这种风格。

 if(bool1 && bool2) voidFunc1(); else voidFunc2(); 

在三元运算符中,操作数必须是非void表达式; 即他们必须产生一些实际价值。

如果你真的想要使用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(); 

有没有办法在没有做任务或伪造作业的情况下进行java三元操作?

好的,所以当你写这样的语句时:

  (bool1 && bool2) ? voidFunc1() : voidFunc2(); 

代码有两个明显的问题:

  1. 条件表达式1的第2和第3个操作数不能调用void方法。 参考: JLS 15.25 。

  2. 表达式不是语句,除非它是赋值表达式或方法调用或对象创建。 参考: JLS 14.8 。

实际上,这些问题中的第二个是语法错误,我希望任何主流Java编译器都能报告它而不是第一个问题。 如果你做了这样的事情,第一个问题只会显露出来:

  SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2(); 

要么

  gobble((bool1 && bool2) ? voidFunc1() : voidFunc2()); 

gobble是一种什么都不做的方法……除了“消耗”其参数的值。

AFAIK,没有可以接受原始表达的上下文。


1 – “条件表达式”是Java语言规范中用于此构造的主要术语。 它在Oracle Java Tutorial中称为“三元条件运算符”。