2013-04-12 82 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教程中被稱爲「三元條件運算符」。