2011-06-28 62 views
4

我正在審查一些代碼,我碰到這個傳來:Java調用方法和使用三元運算符並在參數中分配?

public static doSomething(String myString, String myString2) { 
     //Stuff 
} 

public static doAnotherThing(String myString) { 
     return doSomething(myString = myString != null ? myString.toLowerCase(): myString, null) 
} 

這是如何工作的?正好我知道結果字符串.toLowerCase被分配到MyString的(是的,我知道不好的做法,因爲你不應該重新分配方法參數實際上它們應該是最終的),但我不太確定該方法如何總是接收它需要的2個參數。

我知道它是如何工作當myString爲空或至少我想我做,因爲三元有myString,空,但我不太確定爲什麼它會在那裏時,myString不爲空?

+0

我剛剛意識到像tskuzzy這樣的括號表明這會更容易理解。 –

回答

5

括號來救援!

doSomething(myString = ((myString != null) ? myString.toLowerCase() : myString), null) 

要理解這一點,你需要知道兩件事情:

  • 三元運算符是如何工作的
  • 的賦值運算符返回時,可以指定
+0

謝謝,我知道這兩件事情是如何工作的,令我困惑的是:myString,null,但括號很明顯。再次感謝你。 –

3

doSomething接收兩個參數,它們都是字符串。在doAnotherThing

  • 傳遞給doSomething第一個參數是:
    • null如果myStringnull
    • myString.toLowerCase()否則。
  • 傳遞給doSomething的第二個參數始終爲null

這可能是更清晰改寫這樣的:

public static doAnotherThing(String myString) 
{ 
    if (myString == null) return doSomething(null, null); 
    else return doSomething(myString.toLowerCase(), null); 
} 
+0

謝謝,我和:domain混淆了,null - 我以爲myString被賦予了這兩個值,但是如果我們添加括號,就很清楚了。 –

+0

完成任務有沒有意義?,它的工作原理與刪除作業完全相同。 –

+0

@Oscar在這種情況下,做任務沒有意義。 –

1
myString = myString != null ? myString.toLowerCase(): myString 

這段代碼myString的重新分配是要麼myString.toLowerCase(),或者不重新分配它。但是,使用賦值運算符的行爲返回分配的值,所以你基本上調用此:

//if myString != null 
doSomething(myString.toLowerCase(), null); 

//or if myString is null 
doSomething(myString /*which is null*/, null); 

你也應該注意,字符串是不可變的,而改變的myString的doAnotherThing(字符串)值不會影響傳入該方法的字符串。

+0

你最後一句話是誤導性的。是的,字符串是不可改變的,但這並不意味着您不能將_reference_改爲字符串。 –

3

它只是一個更復雜的版本:

public static doAnotherThing(String myString) 
{ 
    myString = myString != null ? myString.toLowerCase(): myString; 
    return doSomething(myString, null) 
} 

甚至

public static doAnotherThing(String myString) 
{ 
    String s = myString; 
    if (myString != null) 
     s = myString.toLowerCase(); 
    return doSomething(s, null) 
} 
+1

最後一個是詳細的,但最容易理解。它也可以在沒有局部變量的情況下寫入:'if(myString!= null)myString = myString.toLowerCase();返回doSomething(myString,null); ' – leonbloy

1

的東西的事實代碼很混亂,但我不確定問題是什麼。賦值的結果是分配的值。

return doSomething(myString = myString != null ? myString.toLowerCase(): myString, null) 

相同

if(myString != null) myString = myString.toLowerCase(); 
return doSomething(myString, null)