我正在將一些Java代碼轉換爲Scala,試圖儘可能使代碼儘量慣用。因此,我現在有一些代碼使用Options而不是可以爲空的值,我想知道事情是否是scala'ish,或者我是否錯了。那麼,你們可以批評下面的代碼片段嗎?在Scala中使用選項的習慣使用方式
中,我專門找了反饋的領域有:
- 使用一個同伴對象作爲一個工廠,給這取決於我們是否想通過期權或者行2,2選項:是String構造罰款,還是我們應該總是揭露這是一個選項的事實?
- 前提條件的使用:是否有更好的方法來斷言alpha3Code和name是必需的事實,並且必須爲alpha2Code傳遞非null選項? (我正在使用Guava作爲字符串utils,因爲我在Scala API中沒有找到任何東西)
- hashCode,equals和toString的實現。 equals和toString再次委託給Guava,而equals使用模式匹配。有沒有更加糟糕的方式?
- 我知道我可以使用Case類,它會創建默認實現,但我最感興趣的是學習如何實現那些案例類不能使用的情況。
非常感謝!
package com.sirika.openplacesearch.api.language
import com.google.common.base.Objects
import com.google.common.base.Strings
object Language {
def apply(name : String, alpha3Code : String, alpha2Code : Option[String]) = new Language(name, alpha3Code, alpha2Code)
def apply(name : String, alpha3Code : String, alpha2Code : String = null) = new Language(name, alpha3Code, Option(alpha2Code))
def unapply(l : Language) = Some(l.name, l.alpha3Code, l.alpha2Code)
}
class Language(val name : String, val alpha3Code : String, val alpha2Code : Option[String]) {
require(!Strings.isNullOrEmpty(alpha3Code))
require(!Strings.isNullOrEmpty(name))
require(alpha2Code != null)
override def hashCode(): Int = Objects.hashCode(alpha3Code)
override def equals(other: Any): Boolean = other match {
case that: Language => this.alpha3Code == that.alpha3Code
case _ => false
}
override def toString() : String = Objects.toStringHelper(this)
.add("name", name)
.add("alpha3", alpha3Code)
.add("alpha2", alpha2Code)
.toString()
}
的「帽子戲法」,以使用選項是隻使用選項,並迫使消費者做同樣的;-)當然這不是在處理Java(ick!)時總是很實用。歡迎來到SO。 – 2011-01-28 00:52:22
我不認爲需要(alpha2Code!= null)可能會失敗,因爲alpha2Code是一個選項 – Azzie 2014-09-25 21:07:01