2010-03-29 54 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);