2009-10-27 20 views
8

TwiP'u kullanarak Scala'da Java'nın public static final için gerçek bir karşılığı almaya çalışıyorum. yeni bir oluşturulan sınıfın Example$.class parçası ve Twip sınıfından Example.class dan erişemez, çünkü bir object bir val oluşturmaScala: bir sınıftaki genel statik final

benim için çalışmaz.

İşte Scala limana çalışıyorum bir Java sınıfı bir örnek:

public static final String[] MY_STRINGS = { "A", "B", "C" }; 

@Test 
public void myTest(@Values("MY_STRINGS") String string) { 
    ... 
} 

Ama bilmiyorum nasıl Scala public static final portu için. Burada

@RunWith(classOf[TwiP]) 
class Foo { 

    import Foo.MY_STRINGS 

    @Test 
    def testTwiP(@Values("MY_STRINGS") value: String): Unit = { 
    println("I'm testing value " + value + ".") 
    } 

} 

object Foo { 
    val MY_STRINGS = Array("A", "B", "C") 
} 

gibi bir nesne bir val ise sadece aşağıdaki özel durum almak:

net.sf.twip.internal.TwipConfigurationError: 
there is no method or field 'MY_STRINGS' named in the @Values annotation of Parameter#1 

nasıl Scala kullanarak sorunu çözebilir?

+0

mu Twip = http://twip.sourceforge.net/: bir göz atın? –

+0

Eğer öyleyse, belki http://code.google.com/p/scalacheck/ daha uygundur? –

+0

Evet, bu twip. Ben scalacheck kontrol edecektir. Bağlantı için teşekkürler. – renfis

cevap

1

Eğer bir varis kullanırsanız, kendi alıcınızı ve ayarlayıcınızı oluşturabilir ve eğer değer önceden ayarlanmışsa, onu değiştirmeyin.

Bu en iyi yaklaşım olmayabilir, ancak daha iyi bir çözüm daha açık olabileceğinden, bir değişkene neden public static final kullanmak istediğinizi açıklayabilseniz yararlı olur.

+0

Hallo James, yorumunuz için teşekkürler. Ben Scala aşağıdaki yapmaya çalışıyorum: public static final String [] MY_STRINGS = { "A", "B", "C"}; @Test public void mytest (@Values ​​("MY_STRINGS") dize dize) { ... } http://twip.sourceforge.net/howto.html Ama bilmiyorum kamu statik finalini Scala'ya bağlamak için. Bir nesnedeki bir değer ise, yalnızca aşağıdakileri alırım: net121f6.wm.internal.TwipConfigurationError: Parametre # 1 – renfis

+0

@renfis'in @Values ​​ek açıklamasında "myStrings" adlı yöntem veya alan yoktur. Okumanızı daha kolay hale getirmek için bu bilgiyi sorunuza uygun bir şekilde biçimlendirmek istiyorsanız. –

+0

Teşekkürler. Yaptım. – renfis

10
object Foo{ 
    val MY_STRINGS=Array("A","B","C") 
} 
class Foo{ 
    import Foo.MY_STRINGS 
} 

refakatçi nesnesinde val tanım sizin public static final değişkeni oluşturur ve import beyan Eğer sınıf yazmak için kullandığınız kod güzel kolay takma verir.

Scala'daki public static final değişkeninin hala bu kodu Java'dan çağırırsanız statik yöntem çağrısı gibi görüneceğini unutmayın.

Düzeltme: Başka bir yanıtta ayrıntılı olarak gösterdiğim Scala 2.7'deki bir hata nedeniyle biraz yanlışıyım.

public final class Bar extends java.lang.Object{ 
    public static final java.lang.String[] MY_STRINGS(); 
    public static final int $tag()  throws java.rmi.RemoteException; 
} 
public final class Bar$ extends java.lang.Object implements scala.ScalaObject{ 
    public static final Bar$ MODULE$; 
    public static {}; 
    public Bar$(); 
    public java.lang.String[] MY_STRINGS(); 
    public int $tag()  throws java.rmi.RemoteException; 
} 
public class Foo extends java.lang.Object implements scala.ScalaObject{ 
    public Foo(); 
    public int $tag()  throws java.rmi.RemoteException; 
} 

aşağıdaki Scala kod:

class Foo{ 
    import Foo.MY_STRINGS 
} 
object Foo{ 
    val MY_STRINGS=Array("A","B","C") 
} 

oluşturur aşağıdaki Java sınıfları:

class Foo{ 
    import Bar.MY_STRINGS 
} 
object Bar{ 
    val MY_STRINGS=Array("A","B","C") 
} 

aşağıdaki Java sınıfları oluşturur:

+0

Tipp için teşekkürler. Denedim ve sorumu ekledim. Ama benim için çalışmıyor. :( – renfis

+0

scala bir değişken olarak bir değişken maruz Bunun nedeni -. Bunu bir yöntemi çağırır ve yöntemi tarafından döndürülen değerler kullanır @values ​​açıklama bir sürümünü bulmalıyız bir yöntem olarak ortaya –

+0

. Yani, twip gerçek versiyonu bu soruya yeni bir cevap vereceğim. Bu üzücü? Scala ile – renfis

3

aşağıdaki Scala kod

public class Foo extends java.lang.Object implements scala.ScalaObject{ 
    public Foo(); 
    public int $tag()  throws java.rmi.RemoteException; 
} 
public final class Foo$ extends java.lang.Object implements scala.ScalaObject{ 
    public static final Foo$ MODULE$; 
    public static {}; 
    public Foo$(); 
    public java.lang.String[] MY_STRINGS(); 
    public int $tag()  throws java.rmi.RemoteException; 
} 

Nesne sınıfla aynı ada sahip olduğunda, statik üyelerin sınıfta tanımlanmadığı gerçeği, Scala Bug #1735 ve Scala 2.8 anlık görüntülerinde düzeltildi.

Bu nedenle, Scala'yı yükseltmediğiniz veya TwiP'nin Statik olmayan parametre oluşturma yöntemleri ile çalışması için bir yol bulmadığınız sürece TwiP hiç çalışmayacaktır.

İlgili konular