2010-08-04 27 views
10

JPA'daki dizelerle eşlenen scalada bir numaralandırma var. Daha rahat bir kodlama için, aralarındaki örtülü dönüşümleri tanımladım. Bu yüzden şimdi val person.role = "User" değerini tanımlayabilirim, - person.role numaralandırma Numaralı bir dizedir, bu yüzden dönüşüm var. Ama bu ikisini karşılaştırmaya çalıştığımda, her zaman yanlış olurum, çünkü def equals (arg0: Any) : BooleanAny alır, böylece herhangi bir dönüşüm tetiklenmez. Açık bir dönüşüme ihtiyacım var, ama planım bunu göz ardı etmekti, sizce en iyi uygulama hangisidir? En nezih çözüm burada mı?Dize ve Numaralandırmayı Karşılaştırma

+0

Bu eşlemeyi 'Numaralandırma' ve 'Değer' üzerine mi yüklüyorsunuz? – Thomas

+0

@Thomas evet Ben scala'nın scala.Enumeration' ve 'scala kullanıyorum.Yazılım.Value' – coubeatczech

+0

Karşılaştırma için bağlam/kullanım durumu nedir? Desen eşleştirmesi daha iyi bir çözüm sağlayabilir, ancak gerçekten başarmaya çalıştığınız şeye bağlıdır. –

cevap

16

Enumeration numaralı Value("User"), Val türüdür. Ve inanıyorum ki, equals'un uygulanması, değerin dize adını karşılaştırmıyor. Bunu yapmanın ağır bir yolunun kendi adı Enumeration ve Val'u oluşturmasıdır, böylece ad eşleştiğinde doğru olarak döner.

Ancak, kodumda JPA ile değil, her zaman dizeyi MyEnumeration.Value'a dönüştürüyorum. Bir istisna olsun dize numaralandırma herhangi bir isim aynı değilse, withName kullanırken o

object E extends Enumeration { val User = Value("User") } 

scala> val a = E.withName("User") 
a: E.Value = User 

Not: Bu gibi şeyler ile çok kolay.

Sonra hep karşılaştırmalarınızda numaralandırma alanlarını kullanın:

scala> a == E.User 
res9: Boolean = true 

JPA sadece bir dize döndürürse ve çevresinde hiçbir yolu yoktur. Öyleyse en iyi seçeneğin değeri string'e dönüştürmek ve dizgeyi dizge ile eşleştirmek ya da dizeyi Val değerine yükseltmek ve Val'i karşılaştırmak olduğunu düşünüyorum. equals yöntemine bir çeşit uzantı uygulamadığınız sürece bu türlerin karıştırılması karşılaştırma için çalışmaz ve bu zor bir işlemdir. Eğer daha uygun olabilir desen eşleme özelliğini kullanarak dalına karşılaştırma kullanıyorsanız, Thomas'ın Yanıta genişletilmesi

13

:

object Role extends Enumeration { 
    val User = MyValue("User") 
    val Admin = MyValue("Admin") 

    def MyValue(name: String): Value with Matching = 
     new Val(nextId, name) with Matching 

    // enables matching against all Role.Values 
    def unapply(s: String): Option[Value] = 
     values.find(s == _.toString) 

    trait Matching { 
     // enables matching against a particular Role.Value 
     def unapply(s: String): Boolean = 
      (s == toString) 
    } 
} 

Daha sonra bu kullanabilirsiniz şöyle:

def allowAccess(role: String): Boolean = role match { 
    case Role.Admin() => true 
    case Role.User() => false 
    case _ => throw ... 
} 

veya

// str is a String 
str match { 
    case Role(role) => // role is a Role.Value 
    case Realm(realm) => // realm is a Realm.Value 
    ... 
} 
İlgili konular