Estoy convirtiendo algunos códigos Java en Scala, intentando hacer el código lo más idiomático posible.Manera idiomática de usar Options en Scala
Entonces, ahora tengo un código que usa Opciones en lugar de valores que aceptan valores de null, y me pregunto si las cosas son scala'ish, o si estoy equivocado. Entonces, ¿podrían criticar el siguiente fragmento de código?
Las áreas en las que estoy buscando específicamente para la retroalimentación son:
- El uso de un objeto acompañante como una fábrica, dando 2 opciones dependiendo de si queremos pasar Opciones o Cuerdas: es el constructor de String bien, o deberíamos siempre exponer el hecho de que es una opción?
- El uso de condiciones previas: ¿hay formas mejores de afirmar el hecho de que alpha3Code y name son obligatorios, y se debe pasar una opción no nula para alpha2Code? (Estoy recurriendo a Guava para el string utils, ya que no he encontrado nada en la API de Scala)
- La implementación de hashCode, equals y toString. equals y toString delegan a Guava nuevamente, mientras que equals usa la coincidencia de patrones. ¿Hay una forma más escalada?
- Sé que podría haber usado clases Case, lo que habría creado implementaciones predeterminadas, pero estoy interesado principalmente en aprender cómo debo implementarlas para los casos donde las clases de casos no se pueden usar.
¡Muchas gracias!
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()
}
El "truco" para el uso de las opciones es que sólo las opciones de uso y la fuerza de los consumidores a hacer lo mismo ;-) Por supuesto, esto no es siempre práctico cuando se trata de Java (ick!). Bienvenido a SO. –
No creo que require (alpha2Code! = Null) pueda fallar alguna vez ya que alpha2Code es una Opción – Azzie