Scala - 字符串到URL

SRo*_*mes 3 java url scala

我的Scala班级需要一个URL.我可以使用一个String类,但我想要Java内置的URL验证.允许它采用Java Url类或String的最佳方法是什么,如果是String,则将其转换为Java Url?

Mic*_*jac 5

您可以使用重载的构造函数或apply方法:

class A(id: Int, url: URL) {
    def this(id: Int, url: String) = this(id, new URL(url))
}
Run Code Online (Sandbox Code Playgroud)

要么

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

object A {
    def apply(id: Int, url: String): A = new A(id, new URL(url))
}
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,最好为apply方法设置一个`Option [A]`或`Try [A]`,因为`new URL`可能会失败. (2认同)

Gáb*_*kos 5

您可以创建从String到的隐式转换,URL并且仅接受URL(无论如何,这就是您想要的)。在implicit def可能是同伴类或一个辅助类/特性(在蛋糕的图案特征)。像这样:

implicit def `string to url`(s: String) = new URL(s)
Run Code Online (Sandbox Code Playgroud)

用法:

import the.helper.Container._
//or implement the Helper trait containing the implicit def
val url: URL = "http://google.com"
Run Code Online (Sandbox Code Playgroud)

缺点是,异常可能来自意外的地方(任何地方都可能需要进一步的例外import)。

较少隐式的方法是将方法“添加” toURLString,如下所示:

object Helpers {
  implicit class String2URL(s: String) {
    def toURL = new URL(s)
  }
}
Run Code Online (Sandbox Code Playgroud)

用法如下所示:

import Helpers._
val aUrl = "http://google.com".toURL
Run Code Online (Sandbox Code Playgroud)

与@mz答案的比较:您可以通过这种方式组合多个参数,而不会爆发不同参数的组合,而对于该答案,它将是指数级的(尽管对于较小的指数,在这种情况下1,这是非常好的)。@mz的答案不可重用,如果您需要另一个类,则必须再次创建它。它在库方面有效,因此lib用户可以得到一个不错的文档,指导如何使用它,我的将仅在“魔术”和/或少量用户帮助(例如import方法,toURL转换方法调用)的帮助下工作。我也会为小组合选择@mz解决方案,尤其是对Option或进行调整时Try。但是,如果您需要重载多个参数,我认为我的解决方案效果更好。这实际上取决于您的用例。Try 如果传递的网址可能无效,也是如此。)