2010-03-29 53 views
4

我是java的新手,來自ruby世界。我喜歡Ruby的一件事是非常簡潔的語法,如|| =。java等價於ruby的|| ||語法

我當然知道編譯語言是不同的,但我想知道Java是否有類似的東西。

特別是,我做什麼,所有的時間在紅寶石是一樣的東西:

someVar ||= SomeClass.new 

我覺得這是非常簡潔,但功能強大,但迄今爲止唯一的方法我能想到的來達到同樣的事情是一個非常詳細的:

if(someVar == null){ 
    someVar = new SomeClass() 
} 

只是想改善我的Java-fu和語法肯定是我不贊成的一個領域。

+0

哎呀回答了這個對於C#這在C#將'somevar? (somevar = new SomeClass())'如果Java有空合併運算符,它也應該等效(我假設)。 – 2010-03-29 17:58:32

+0

@Chris - 你的意思是'someVar = someVar ?? new SomeClass()':) – 2010-03-29 18:00:53

+0

@Nick不,我的意思就是我說的至少在C#中。一個真實世界的例子是'public List Strings {set {_strings = value; } get {return _strings ?? (_strings = new List ())};'。現在,如果只有我可以指定一個自動屬性,get是自我生成的,如果它爲null。或許有點像'public List Strings {set;安全,獲得; }' – 2010-03-29 18:06:41

回答

10

無,沒有。但更換

if(someVar == null){ 
    someVar = new SomeClass() 
} 

類似計劃爲Java 7 Elvis Operator

somevar = somevar ?: new SomeClass(); 

截至目前,最好的辦法是Ternary operator

somevar = (somevar != null) ? somevar : new SomeClass(); 
+1

我通常不支持Java和20世紀中期搖滾的結合,但在這種情況下,我會拒絕我的反對意見。 – Chris 2010-03-29 18:12:36

1

在Java中沒有等價物。部分原因是null不被認爲是false

所以,即使有一個邏輯或分配的關鍵字,你要記住的是:

Object x = null; 
if (!x) { // this doesnt work, null is not a boolean 
+1

如果(obj)應該評估爲obj!= null,這是我最想念C語言與其他高級語言相比的事情之一。我發現它已經從我們身上移除真的很愚蠢。 – 2010-03-29 18:04:14

5

我認爲你能做的最好的是三元運算符:

someVar = (someVar == null) ? new SomeClass() : someVar; 
+0

我不得不閱讀這3次,以弄清楚它將如何評估somevar =(somevar == null)......聰明,但我不想成爲那個堅持這一點的人。 – David 2010-03-29 19:42:39

+0

嗯,我不認爲三元通常被認爲是聰明的,請參閱http://stackoverflow.com/questions/160218。我想你已經習慣了他們。 – notJim 2010-03-29 19:48:59

+0

YIKES!我讀完這個完全錯誤的......出於某種原因,我的大腦將它讀爲「if(somevar =(somevar == null))...」,所以它看起來像是在評估賦值運算符的結果。 – David 2010-03-29 20:22:46

0

這看起來像你能向SomeClass添加一個類似於

的方法
public static someClass enforce(someClass x) { 
someClass r = x.clone(); 
if(r == null){ 
    r = new SomeClass(); 
} 

return r; 
} 

,並調用它像

someVar = SomeClass.enforce(someVar);