2014-12-21 150 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無效的情況)