2017-10-14 7 views
1

さらにタイプセーフティを導入するには、shapelessによって提供されるタグ付きタイプを使用するか、AnyValを拡張するクラスを作成します。 1つを他のものよりも使用することの違いと利点/欠点は何ですか?タグ付きタイプとクラスを拡張するAnyVal

例:countryCode.toUpperCase

trait CountryCodeTag 
type CountryCode = String @@ CountryCodeTag 

class CountryCode(code: String) extends AnyVal 

答えて

2

type CountryCode = String @@ CountryCodeTag

+ String @@ CountryCodeTagStringから、すなわちすべてのメソッドを直接使用することができ、Stringのサブタイプです。

String @@ CountryCodeTagは、Stringが予期される場所で誤って使用される可能性があります。つまり、タイプセーフではありません。

−新しい値を作成するのは少し厄介です:"a".asInstanceOf[String @@ CountryCodeTag]またはval tagger = new Tagger[CountryCodeTag]; tagger("a")です。

−シェイプレス依存(手動でも可能ですが)。

class CountryCode(code: String) extends AnyVal

+これは、より多くのタイプセーフです。 Stringから

−方法は、いくつかの余分な努力と用意されています

class CountryCode(val code: String) extends AnyVal 
new CountryCode(countryCode.code.toUpperCase) 

または

class CountryCode(val code: String) extends AnyVal 
object CountryCode { 
    def unapply(...) = ... 
} 
countryCode match { case CountryCode(code) => new CountryCode(code.toUpperCase) } 

または

case class CountryCode(code: String) extends AnyVal 
countryCode.copy(code = countryCode.code.toUpperCase) 

+は、新しい値を作成もう少し自然です:new CountryCode("a")

+特別な依存関係はありません(これはScalaです)。

+0

短所の例を教えてください。 '' 'String @@ CountryCodeTagは、いくつかのStringが期待される場所で誤って使用される可能性がありますか? – gyoho

+0

@gyoho 'val countryCode:String @@ CountryCodeTag = ???' 'case class Person(name:String)' 'Person(countryCode)' –

+0

メモリフットプリントの観点から、どちらが良いと思いますか? – gyoho

関連する問題