2014-12-21 2 views
3

Для моего класса Scala требуется URL. Я мог бы использовать класс String, но мне хотелось бы, чтобы встроенная проверка URL-адресов Java. Каков наилучший способ позволить ему взять либо Java Url class, либо String, и, если String, превратить его в Java Url?Scala - String to 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

IMHO лучше иметь опцию [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 

Сравнение с @ М.З. годов Ответ: вы можете комбинировать несколько параметров таким образом без взрыва комбинации разных параметров, в то время как для этого ответа он будет экспоненциальным (хотя для небольших показателей, например, в этом случае 1, это совершенно нормально). Ответ @ m-z не может быть повторно использован, если вам нужен другой класс, вам нужно его снова создать. Он работает на стороне библиотеки, поэтому пользователи lib получают хорошую документацию, руководство по ее использованию, мои будут работать только с магии и/или небольшой помощью пользователя (например, import метода, toURL метод преобразования вызова). Я бы выбрал решение @ m-z для небольших комбинаций, особенно с настройкой Option или Try. Но если вам нужно перегрузить несколько параметров, я думаю, что мое решение работает лучше. Это действительно зависит от вашего варианта использования. (Вы можете обернуть мой с помощью Try, если могут быть случаи, когда переданный URL недействителен.)