Scala - 将字符串转换为URL

7

我的 Scala 类需要一个 URL。我可以使用 String 类,但我想要 Java 内置的 URL 验证。那么,最好的方法是什么,可以让它接受 Java Url 类或字符串,并在字符串情况下将其转换为 Java Url?

2个回答

7
您可以创建一个从StringURL的隐式转换,并且只接受URL(这正是您想要的)。implicit def可以在伴随类或辅助类/特质(如蛋糕模式中的特质)中定义。下面是示例代码:
implicit def `string to url`(s: String) = new URL(s)

使用方法:

import the.helper.Container._
//or implement the Helper trait containing the implicit def
val url: URL = "http://google.com"

缺点是,异常可能来自意想不到的地方(可能需要进一步的import)。
更少隐含的方法是将toURL方法“添加”到String中,如下所示:
object Helpers {
  implicit class String2URL(s: String) {
    def toURL = new URL(s)
  }
}

这个的使用示例如下:

import Helpers._
val aUrl = "http://google.com".toURL

与@m-z的答案相比:您可以通过这种方式组合多个参数,而不会导致不同参数的组合爆炸,而对于那个答案,它将指数增长(虽然对于小的指数,像在这种情况下的1,那是完全可以的)。 @m-z的答案无法重复使用,如果您需要另一个类,则必须再次创建它。它在库方面起作用,因此库用户获得了很好的文档和指南,我的只能通过“魔法”和/或小型用户帮助(例如方法importtoURL转换方法调用)工作。对于小的组合,我也会选择@m-z的解决方案,特别是调整OptionTry。但是,如果您需要超载多个参数,则认为我的解决方案更好。 这真的取决于您的用例。(如果传递的url不正确,也可以将我的代码包装在Try中。)

5
你可以使用重载构造函数或 apply 方法:
class A(id: Int, url: URL) {
    def this(id: Int, url: String) = this(id, new URL(url))
}

或者

case class A(id: Int, url: URL)

object A {
    def apply(id: Int, url: String): A = new A(id, new URL(url))
}

3
在我看来,最好为apply方法使用Option[A]Try[A],因为new URL可能会失败。 - Dimitri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接