2013-04-12 49 views
20

有没有做一个java三元操作没有做任务或方式伪造assingment的方法?爪哇三元没有分配

我喜欢简洁的三元代码在做一堆if/then/elses时的外观。

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

喜欢的东西:

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

我的函数的返回类型void的,所以如果有一种方法来伪造这个在分配中,使其工作,然后我的“M处之泰然..我想看看如何做到这一点虽然:)

+0

@VenomFangs你可以改变你的函数总是返回一个常量值,并将这个返回值赋给一个虚拟变量。但是这不值得 - 麻烦 - 代码看起来很愚蠢,恐怕。更好地做到这一点,因为你已经知道你应该这样做。 –

回答

17

不,你不能那样做。 spec says so

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

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

它是第二或第三操作数 表达成为一个空隙方法的调用一个编译时间错误。

[编辑]

既然你问了一下反思,这里有一个解决方案。我不推荐这个。我只是因为你提问才发布它。

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); 
    } 
} 

在你要问自己,如果是succint提高代码的可读性一天结束(想想for-each循环)。这些解决方案都没有改善代码的可读性恕我直言。如果我是你,我宁愿去这个。

if(condition) 
    a(); 
else 
    b(); 

我其实我为甚至包括当环路仅包含一行牙套,但因为你是清脆的代码后去,在上面的代码段应该做的。

+0

任何想法的反思评论在:http://stackoverflow.com/questions/4830843/in-java-is-it-possible-to-cast-to-void -not-void –

+0

有没有办法让void反映为null,然后将null分配给一个对象? –

+2

用反思性解决方案编辑我的答案。对于学术目的当然:) –

8

不,你不能做到这一点是这样的。

你可以喜欢这种风格,如果不喜欢使其更语句。

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

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

+0

我喜欢这个演示文稿......如果没有人能告诉我一个办法,我会接受这个答案。例如。通过虚空的反映为空...等 –

1

如果你真的想要使用ternany操作,那么有一个黑客攻击。 但这是非常糟糕的代码,仅用于显示语言的能力。 我永远不会推荐将此代码投入生产或甚至向朋友展示。

int dummy = (bool1 && bool2) ? new Object(){ 
     public int hashCode() { 
      yourFunction1(); 
      // ... 
      yourFunctionN(); 
      return 0; 
     }; 
    }.hashCode() : new Object(){ 
     public int hashCode() { 
      yourAnotherFunction1(); 
      // ... 
      yourAnotherFunctionN(); 
      return 0; 
     }; 
    }.hashCode(); 
1

有没有办法做一个Java三元操作而不做转让或方法来伪造分配?

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

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

有两个不同的问题与代码:

  1. 条件表达式的第二和第三个操作数1不能调用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教程中被称为“三元条件运算符”。