Java中类似于Ruby的||=语法的等效写法是什么?

4

我是一个刚接触Java的新手,之前从事Ruby开发。我喜欢Ruby非常简洁的语法,例如||=。

当然,我知道编译型语言与解释型语言不同,但我想知道Java是否有类似的语法。

特别地,在Ruby中我经常这样做:

someVar ||= SomeClass.new

我认为这种方法非常简洁而强大,但目前我所能想到的实现同样效果的唯一方法是非常冗长的:

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

我只是想提升我的Java技能,语法肯定是我不擅长的领域之一。


@Chris - 你的意思是 someVar = someVar ?? new SomeClass() :) - Nick Craver
@Nick 不好意思,我是指在C#中确实是这样的。一个现实世界的例子是 public List<string> Strings { set { _strings = value; } get { return _strings ?? (_strings = new List<string>()) };。现在如果我能指定一个自动生成的自动属性,如果它为空就自动生成get方法就好了。也许可以像这样:public List<string> Strings { set; safe-get; } - Chris Marisic
@Chris - 是的,但他的 Ruby 语句等价于我发布的 :) someVar ||= SomeClass.new == someVar = someVar ?? new SomeClass() 在 C# 中,它既是赋值又是获取,只是在 Ruby 中非常简短。 - Nick Craver
虽然我对Ruby的了解非常有限,但我相信我的版本是C#的字面解释。我假设在Ruby中,你可以执行return someVar ||= SomeClass.new,但你不能执行return someVar = someVar ?? new SomeClass(),而我的版本可以。如果你不能在Ruby中执行return someVar ||= SomeClass.new,那么无论是if/else、三元运算符、空值合并赋值还是空值合并自赋值,在C#中实现它都无所谓。 - Chris Marisic
@Chris - 你可以在Ruby中返回它,也可以在C#中返回任何赋值,包括 return someVar = someVar ?? new SomeClass(),试试吧 :) 但是...大多数情况下,在Ruby中你并不会使用这种方式进行返回,只是为了在几行代码后使用它。 - Nick Craver
显示剩余2条评论
4个回答

10

没有,但可以替换

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

Java 7中将会推出类似的运算符,称为Elvis Operator

somevar = somevar ?: new SomeClass();

目前为止,你最好的选择是使用三元运算符

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

1
我通常不支持Java和20世纪中期的摇滚乐的结合,但在这种情况下,我会保留我的反对意见。 - Chris

5

我认为最好的方法是使用三元运算符:

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

我不得不读三遍才能弄清楚它如何评估 somevar =(somevar == null)...聪明,但我不想成为被困在维护这个代码的人。 - David
嗯,我认为三元运算符通常不被认为是聪明的做法,参见https://dev59.com/CXVC5IYBdhLWcg3w21Mq。我猜你会习惯它们的使用。 - davidtbernal
天啊!我完全读错了……由于某种原因,我的大脑将它读成了“if(somevar=(somevar==null))…”,所以看起来像是在评估赋值运算符的结果。 - David

1

Java中没有相应的等价物。部分原因是因为null不被视为false

因此,即使有逻辑OR-assignment关键字,你也必须记住:

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

1
这是我最怀念 C 语言相对于其他高级语言的一点,即 if(obj) 应该被评估为 obj != null。我觉得它被从我们身边移除了真的很愚蠢。 - Chris Marisic

0

看起来你可以在SomeClass中添加一个类似的方法

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

 return r;
}

并像这样调用它

someVar = SomeClass.enforce(someVar);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接