2011-06-13 9 views
5

मुझे एक बिल्डर लाइब्रेरी की आवश्यकता है जिसे स्कैला और जावा से बुलाया जा सकता है। डिफ़ॉल्ट, नाम पैरामीटर का उपयोग कर स्कैला में काफी आसान है। लेकिन मैं इस कोड को जावा से कैसे कॉल करूं? निचे देखो। या शायद मुझे एक धाराप्रवाह एपीआई के साथ जाना चाहिए जो दोनों भाषाओं के लिए अधिक आम है?स्केल और जावा के लिए बिल्डर लाइब्रेरी

स्काला:

case class Person(gender:Gender.Value, firstName:String, lastName:String){ 
    def fullName = lastName+", "+firstName 
    override def toString = firstName+","+lastName+","+gender 
} 
case class PersonBob(
    gender:Gender = GenderBob().build, 
    firstName:String = null, 
    lastName:String = null) { 
    def build = Person(
    gender, 
    if(firstName == null) NameBob(if(gender==Gender.Male) engMaleNames 
     else engFemaleNames).build else firstName, 
    if(lastName==null) NameBob(engLastNames).build 
     else lastName 
    ) 
    } 

उपयोग:

val p1 = PersonBob().build 
val p2 = PersonBob(lastName = "Jones").build 

जावा उपयोग:

Person p1 = ? 
Person p2 = ? 

उत्तर

3

डिफ़ॉल्ट तर्कों के रूप से आखिरी बयान में उल्लेख किया है, स्केला और जावा के बीच अंतर-संचालित नहीं कर रहे हैं http://www.scala-lang.org/node/2075

यह निर्धारित करने के लिए कि जावा से ऊपर दिए गए कोड का उपयोग कैसे करें, शायद जावप मदद कर सकता है। चलिए आपके द्वारा पोस्ट की गई तुलना में एक छोटा उदाहरण लें। उदाहरण

case class PersonBob(a: String = "aa", b: String = null) 

इस scalac का उपयोग कर संकलन, और उसके बाद का उत्पादन वर्ग फ़ाइल पर javap चल (.class विस्तार के बिना), हम

public class PersonBob extends java.lang.Object implements scala.ScalaObject,scala.Product,scala.Serializable { 
    public static final java.lang.String apply$default$2(); 
    public static final java.lang.String apply$default$1(); 
    public static final java.lang.String init$default$2(); 
    public static final java.lang.String init$default$1(); 
    public static final scala.Function1 tupled(); 
    public static final scala.Function1 curry(); 
    public static final scala.Function1 curried(); 
    public scala.collection.Iterator productIterator(); 
    public scala.collection.Iterator productElements(); 
    public java.lang.String a(); 
    public java.lang.String b(); 
    public PersonBob copy(java.lang.String, java.lang.String); 
    public java.lang.String copy$default$2(); 
    public java.lang.String copy$default$1(); 
    public int hashCode(); 
    public java.lang.String toString(); 
    public boolean equals(java.lang.Object); 
    public java.lang.String productPrefix(); 
    public int productArity(); 
    public java.lang.Object productElement(int); 
    public boolean canEqual(java.lang.Object); 
    public PersonBob(java.lang.String, java.lang.String); 
} 

पाने के लिए हम देख सकते हैं कि केवल निर्माता हमारे पास है

public PersonBob(java.lang.String, java.lang.String); 

तो आपके मामले में, अपने जावा कोड

कुछ ऐसा दिखाई देगा

यह मानते हुए कि लिंगबोर वर्ग अपने कन्स्ट्रक्टर में कोई पैरामीटर नहीं लेता है। जावा में यह कितना धाराप्रवाह है, मुझे लगता है कि आखिरकार यह स्वाद का विषय है, लेकिन मेरी विनम्र राय में मुझे लगता है कि जावा संस्करण एक निर्माता

+0

के लिए कम वर्बोज़ हो सकता है ध्यान दें कि मैंने एक समान लेकिन अलग प्रश्न बनाया है प्रकार-सुरक्षित निर्माता के संबंध में। देखें [http://stackoverflow.com/questions/6347083/type-safe-buider-library-for-scala-and-java ](httpoverstow.com/questions/6347083/type-safe-buider-library -किसी-स्केला और जावा) – eptx

संबंधित मुद्दे