Java三元没有分配

时间:2013-04-12 17:03:08

标签: java ternary-operator ternary

有没有办法在没有做任务的情况下进行java三元操作或假装分配?

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

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

类似的东西:

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

我的函数是返回类型void,所以如果有一种方法可以在赋值中伪造它以使其正常工作,那么我就可以了...我想看看怎么做虽然:)

4 个答案:

答案 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. 条件表达式 1 的第2和第3个操作数不能调用void方法。参考:JLS 15.25

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

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

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

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

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

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

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