Sto convertendo un codice Java in Scala, cercando di rendere il codice il più idiomatico possibile.Modo idiomatico per usare le opzioni in Scala
Così, ora ho del codice usando Opzioni invece di valori nullable, e mi chiedo se le cose siano di scala o se ho torto. Quindi, potresti per favore criticare il seguente snippet di codice?
Le aree in cui sono specificamente alla ricerca di un feedback sono:
- L'uso di un oggetto associato come una fabbrica, dando 2 opzioni a seconda se vogliamo passare le opzioni o stringhe: è il costruttore String bene, o dovremmo sempre esporre il fatto che si tratta di un'opzione?
- L'uso delle precondizioni: esistono modi migliori per affermare il fatto che alpha3Code e nome sono obbligatori e deve essere passata un'opzione non nulla per alpha2Code? (Sto ricorrendo a Guava per gli utils di stringa, poiché non ho trovato nulla nell'API di Scala)
- L'implementazione di hashCode, equals e toString. equals e toString delegato di nuovo a Guava, mentre equals usa il pattern matching. Esiste un modo più scalare?
- So che avrei potuto utilizzare le classi Case, che avrebbero creato implementazioni predefinite, ma sono principalmente interessato a imparare come implementare quelle per i casi in cui le classi di casi non possono essere utilizzate.
Grazie mille!
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()
}
Il "trucco" di utilizzare le opzioni è quello di uniche opzioni di utilizzo e la forza del consumatore a fare lo stesso ;-) Naturalmente questo non è sempre pratico quando si ha a che fare con Java (ick!). Benvenuti in SO. –
Non credo che require (alpha2Code! = Null) possa mai fallire poiché alpha2Code è un'opzione – Azzie