2014-12-21 151 views
3

我的Scala类需要一个URL。我可以使用String类,但我希望Java内置URL验证。允许它使用Java Url类或String的最佳方法是什么,如果是String,则将其转换为Java Url?斯卡拉 - 字符串到网址

回答

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)) 
} 
+2

恕我直言,最好有一个'Option [A]'或者'Try [A]'作为apply方法,因为'新的URL“可能会失败。 – Dimitri

4

您可以从String的隐式转换到URL和只接受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 

比较@ MZ的答案:你可以用这种方法组合多个参数,而不用组合不同参数的爆炸,而对于那个答案它将是指数的(虽然对于小指数,例如在这种情况下1,这非常好)。 @ m-z的答案是不可重用的,如果你需要另一个类,你必须重新创建它。它在库的一边工作,所以lib用户得到一个很好的文档,指导如何使用它,我的只是与“魔术”和/或小型用户帮助(如import的方法,toURL转换方法调用)一起工作。我也会选择@ m-z的小组合解决方案,特别是在调整OptionTry时。但是如果您需要重载多个参数,我认为我的解决方案效果更好。这真的取决于你的用例。 (你也可以用Try来包装我,如果有可能是传递的url无效的情况)