2009-10-27 16 views
8

में सार्वजनिक स्थिर अंतिम TwiP का उपयोग करने के लिए मैं जावा में public static final के लिए वास्तविक समकक्ष प्राप्त करने की कोशिश कर रहा हूं।स्कैला:

एक object में एक val बनाना मेरे लिए काम नहीं करता है, क्योंकि यह एक नया उत्पन्न वर्ग Example$.class का हिस्सा है और TwiP वर्ग Example.class से उस तक पहुंच नहीं कर सकता।

यहाँ मैं स्काला के बंदरगाह के लिए कोशिश कर रहा हूँ एक जावा वर्ग का एक उदाहरण है:

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

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

लेकिन मैं नहीं जानता कि कैसे बंदरगाह स्काला के public static final करने के लिए। यदि यह यहाँ

@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") 
} 

की तरह एक वस्तु में एक वैल है मैं केवल निम्न अपवाद प्राप्त करें:

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

मैं स्काला का उपयोग कर समस्या कैसे हल कर सकते हैं?

+0

क्या TwiP = http://twip.sourceforge.net/ है? –

+0

यदि ऐसा है, तो शायद http://code.google.com/p/scalacheck/ अधिक उपयुक्त है? –

+0

हां, यह यह twip है। मैं स्केलशेक की जांच करूंगा। लिंक के लिए आपको धन्यवाद। – renfis

उत्तर

1

यदि आप एक var का उपयोग करते हैं तो आप अपना खुद का गेटर और सेटर बना सकते हैं, और यदि मान पहले ही सेट हो चुका है, तो इसे न बदलें।

यह सबसे अच्छा तरीका नहीं हो सकता है, लेकिन यह उपयोगी होगा यदि आप समझा सकते हैं कि आप एक चर पर public static final का उपयोग क्यों करना चाहते हैं, क्योंकि बेहतर समाधान तब अधिक स्पष्ट हो सकता है।

+0

हेलो जेम्स, धन्यवाद, आप टिप्पणी कर रहे हैं। मैं निम्नलिखित में निम्नलिखित बनाने की कोशिश कर रहा हूं: सार्वजनिक स्थैतिक अंतिम स्ट्रिंग [] MY_STRINGS = {"ए", "बी", "सी"}; @Test सार्वजनिक शून्य myTest (@Values ​​("MY_STRINGS") स्ट्रिंग स्ट्रिंग) { ... } http://twip.sourceforge.net/howto.html लेकिन मैं पता नहीं कैसे सार्वजनिक स्थैतिक फाइनल को स्कैला को बंद करने के लिए। यदि यह किसी ऑब्जेक्ट में एक वैल है तो मुझे केवल निम्न मिलता है: net.sf.twip.internal.TwipConfigurationError: पैरामीटर # 1 – renfis

+0

@renfis के @Values ​​एनोटेशन में नामित कोई विधि या फ़ील्ड 'myStrings' नहीं है - आप शायद इसे पढ़ने में आसान बनाने के लिए, इस जानकारी को अपने प्रश्न में सही ढंग से स्वरूपित करना चाहते हैं। –

+0

धन्यवाद। मैंने यह किया। – renfis

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

साथी वस्तु में val परिभाषा अपने public static final चर बनाता है, और import घोषणा यह कोड आपको वर्ग लिखने के लिए प्रयोग कर रहे हैं में एक अच्छा आसान उर्फ ​​देता है।

ध्यान दें कि स्काला में public static final चर अभी भी एक स्थिर विधि कॉल की तरह लग रहे करने के लिए यदि आप जावा से इस कोड को फोन संकलित कर देगा।

संपादित करें: मैं स्कैला 2.7 में एक बग के कारण थोड़ा गलत हूं, जिसे मैं किसी अन्य उत्तर में विस्तार से प्रदर्शित करता हूं।

+0

टिप के लिए धन्यवाद। मैंने इसे आजमाया और इसे मेरे प्रश्न में जोड़ा। लेकिन यह मेरे लिए काम नहीं करता है। :( – renfis

+0

ऐसा इसलिए है क्योंकि स्कैला चर के रूप में एक चर का खुलासा नहीं करता है - यह इसे एक विधि के रूप में उजागर करता है। आपको @values ​​एनोटेशन का एक संस्करण ढूंढना होगा जो विधि को कॉल करता है और विधि द्वारा लौटाए गए मानों का उपयोग करता है। –

+0

आपका मतलब है, ट्विआईपी का वास्तविक संस्करण स्कैला के साथ काम नहीं करेगा? यह एक दयालुता है। – renfis

3

निम्नलिखित स्काला कोड:

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; 
} 

निम्नलिखित स्काला कोड:

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

उत्पन्न करता है निम्नलिखित जावा वर्गों:

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

निम्नलिखित जावा वर्गों उत्पन्न करता है

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; 
} 

तथ्य जब वस्तु एक ही नाम है के रूप में वर्ग Scala Bug #1735 है और यह स्काला 2.8 स्नैपशॉट में ठीक किया गया है कि स्थिर सदस्यों वर्ग पर परिभाषित नहीं कर रहे हैं।

तो ऐसा लगता है कि TwiP जब तक आप या तो स्काला अपग्रेड करें, या TwiP गैर स्टेटिक पैरामीटर पीढ़ी के तरीकों के साथ काम करने के लिए पाने के लिए एक रास्ता खोजने बिल्कुल काम करने के लिए नहीं जा रहा है।

2

आपको केवल एक साथी वस्तु में चर "वैल" के रूप में परिभाषित करना होगा।

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

नोट: स्कैला में अंतिम स्थैतिक चर जावा में समान सम्मेलन का पालन नहीं करते हैं। एक नज़र डालें: http://docs.scala-lang.org/style/naming-conventions.html