在Scala中使用选项的惯用方法
我正在将一些
Java代码转换为Scala,试图尽可能使代码成为惯用语.
所以,我现在有一些使用Options而不是可空值的代码,我想知道是不是scala’ish,或者我是不是错了.所以,你们可以批评下面的代码片段吗? 我特意寻找反馈的领域是: >使用伴随对象作为工厂,根据我们是否要传递Options或Strings提供2个选项:String构造函数是否正常,或者我们是否应该总是暴露它是一个Option的事实? 非常感谢 ! 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,alpha2Code : String = null) = new Language(name,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() } 解决方法
我认为你应该只在工厂方法中公开Option [String].例如,我作为您图书馆的用户,也会问自己问我应该使用哪种工厂方法.而且很可能我会使用Option.
Scala为我们提供了足够的工具,使我们的生活更轻松.例如,您可以使用默认选项,如下所示: def apply(name: String,alpha3Code: String,alpha2Code: Option[String] = None) = new Language(name,alpha2Code) 如果我再次作为你的库的用户,想要传递只是字符串,而不是将其包装在Some中,我可以编写自己的隐式转换,如下所示: implicit def anyToOption[T](t: T): Option[T] = Some(t) 甚至(如果我个人使用空值): implicit def anyToOption[T](t: T): Option[T] = if (t == null) None else Some(t) 但我相信,如果您强制执行选项,它将使您的API更加稳固和清晰. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |