令人尴尬的基本-初始化类中的字段为null-Scala
为了学习Scala,我正在转换一个小型Java项目 我有这样一个bean类。我们的目标是有两个领域和获得者和二传者来配合它。对于数字或令人尴尬的基本-初始化类中的字段为null-Scala,scala,Scala,为了学习Scala,我正在转换一个小型Java项目 我有这样一个bean类。我们的目标是有两个领域和获得者和二传者来配合它。对于数字或字符串,我知道我们可以用“0”或空字符串初始化它。然而,对于类,我不知道用什么来初始化它。我知道null在Scala中是不受欢迎的 class CoreSearchPageResultS extends Serializable { var wikiHits: SearchResult[WikiSearchHit]=null var webHits: S
字符串
,我知道我们可以用“0”或空字符串初始化它。然而,对于类,我不知道用什么来初始化它。我知道null
在Scala中是不受欢迎的
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
[错误](请注意,需要初始化变量才能定义)*
我知道我在做一些非常愚蠢和尴尬的事情。请帮忙
我知道null
在Scala中是不受欢迎的
的确如此null
实际上只存在于与Java的互操作性中;不要将其用于本机Scala代码
使用选项
代替具有可选值的内容Option
有两个具体的子类,Some
和None
。例如:
var wikiHits: Option[SearchResult[WikiSearchHit]] = None
稍后:
wikiHits = Some(getSearchResult())
然后,您可以进行模式匹配,或使用进行理解,或使用选项上的其他方法:
wikiHits match {
case Some(result) => println("Result: " + result)
case None => println("No result!")
}
这取决于您的用例,但是延迟初始化的lazy val远比作为选项键入的可变变量更习惯于Scala:
lazy val wikiHits:SearchResult[WikiSearchHit]=getSearchResult(输入)
只有在第一次访问wikiHits时才会调用getSearchResult。如果搜索可能不返回任何结果,您可能仍然希望将wikiHits作为一个选项。仅供参考,我也是一名Java难民。不久前,当我了解了选项
类型后,我写了一篇关于这一点的博文:就我个人而言,我会对字符串和int(它们是scala中的纯对象,而不是原语)使用相同的方法。它可以防止您在以后发现您认为对初始化来说是良性的非值,实际上对某人意味着什么时感到心痛和头痛。。。