Идиоматический способ использования опций в Scala

Я конвертирую некоторый код Java в Scala, пытаясь сделать код как можно более идиоматическим.

Итак, теперь у меня есть код, использующий параметры вместо значений, допускающих значение NULL, и мне интересно, все ли в порядке, или я ошибаюсь. Итак, не могли бы вы, ребята, раскритиковать следующий фрагмент кода?

Области, в которых я специально ищу обратную связь, следующие:

  • Использование сопутствующего объекта в качестве фабрики, дающее 2 варианта в зависимости от того, хотим ли мы передать параметры или строки: подходит ли конструктор String, или мы всегда должны раскрывать тот факт, что это параметр?
  • Использование предварительных условий: есть ли лучшие способы подтвердить тот факт, что alpha3Code и имя являются обязательными, а не Параметр -null должен быть передан для alpha2Code? (Я прибегаю к Guava для строковых utils, так как я ничего не нашел в Scala API)
  • Реализация hashCode, equals и toString. equals и toString снова делегируют Guava, тогда как equals использует сопоставление с образцом. Есть ли более масштабный способ?
  • Я знаю, что мог бы использовать классы Case, которые создавали бы реализации по умолчанию, но меня больше всего интересует, как мне реализовать их для случаев, когда классы 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()
}

5
задан Sami Dalouche 27 January 2011 в 22:01
поделиться