令人尴尬的基本 - 将Class中的字段初始化为null - Scala

时间:2013-12-17 09:18:08

标签: scala

尝试接收Scala,我正在转换一个小型Java项目。

我有这样的bean类。目标是有两个字段,getter和setter与它一起使用。对于Numbers或String,我理解我们可以用'0'或空字符串初始化它。但是,对于类,我不知道用什么来初始化它。我知道在Scala中null不受欢迎。

class CoreSearchPageResultS extends Serializable {

  var wikiHits: SearchResult[WikiSearchHit]=null
  var webHits: SearchResult[WebSearchHit]=null


}

相反,我应该像这样初始化吗?

var wikiHits: SearchResult[WikiSearchHit]=new SearchResult[WikiSearchHit]();
var webHits: SearchResult[WebSearchHit]=new SearchResult[WebSearchHit]();

我理解这意味着在构造函数完成时,构造对象是不必要的。

我尝试了以下内容,但是我收到了编译错误。

private var _wikiHits: SearchResult[WikiSearchHit]

def wikiHits:SearchResult[WikiSearchHit]=_wikiHits
def wikiHits_(wikiHits:SearchResult[WikiSearchHit])=_wikiHits=wikiHits

错误:

*类CoreSearchPageResultS需要是抽象的,因为未定义变量_wikiHits [错误](请注意,变量需要初始化才能定义)*

我明白我正在做一些非常愚蠢和令人尴尬的事情。请帮忙。

2 个答案:

答案 0 :(得分:8)

  

我理解,null在Scala中不受欢迎。

事实上。 null实际上只存在与Java的互操作性;不要将它用于本机Scala代码。

使用Option代替可选的值。 Option有两个具体的子类SomeNone。例如:

var wikiHits: Option[SearchResult[WikiSearchHit]] = None

后来:

wikiHits = Some(getSearchResult())

然后,您可以进行模式匹配,或使用for理解,或使用Option上的其他方法:

wikiHits match {
  case Some(result) => println("Result: " + result)
  case None => println("No result!")
}

答案 1 :(得分:1)

这取决于你的用例,但是一个懒惰初始化的懒惰的val是比作为选项输入的可变变量更惯用的Scala:

lazy val wikiHits:SearchResult [WikiSearchHit] = getSearchResult(input)

getSearchResult只会在第一次访问wikiHits时被调用。如果搜索可能无法返回结果,您可能仍希望将wikiHits设为选项。