尝试接收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 [错误](请注意,变量需要初始化才能定义)*
我明白我正在做一些非常愚蠢和令人尴尬的事情。请帮忙。
答案 0 :(得分:8)
我理解,
null
在Scala中不受欢迎。
事实上。 null
实际上只存在与Java的互操作性;不要将它用于本机Scala代码。
使用Option
代替可选的值。 Option
有两个具体的子类Some
和None
。例如:
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设为选项。