2010-10-05 4 views
8

मैं वर्तमान में भविष्य की परियोजनाओं के लिए स्कैला का मूल्यांकन कर रहा हूं और कुछ अजीब आया हूं। मैंने जेएसपी में हमारे लिए निम्नलिखित स्थिरता बनाई:जावा में स्कैला स्थिरांक का उपयोग करें

val FORMATED_TIME = "formatedTime"; 

और यह काम नहीं किया। कुछ प्रयोग करने के बाद मैंने इसके नीचे जाने के लिए डिकंपाइल करने का निर्णय लिया:

private final java.lang.String FORMATED_TIME; 

public java.lang.String FORMATED_TIME(); 
    Code: 
    0: aload_0 
    1: getfield #25; //Field FORMATED_TIME:Ljava/lang/String; 
    4: areturn 

अब यह दिलचस्प है! व्यक्तिगत रूप से मैं काफी समय से सोच रहा हूं कि इंस्पेक्टर को और एक म्यूटेटर को जावा में सेट करें क्योंकि वे अलग-अलग नाम-रिक्त स्थान पर रहते हैं।

हालांकि यह बाकी टीम के बारे में बताने के लिए अभी भी अजीब हो सकता है। तो इंस्पेक्टर के बिना सार्वजनिक स्थिर होना संभव है?

उत्तर

11

यह Uniform Access Principle की वजह से है, यानी: तरीके और फील्ड्स अप्रभेद्य हैं

देखें this answer

स्काला 2.8.0 में इसका मतलब है अगर आप है एक साथी वस्तु, आप अपने स्थिर खोना भाड़ा के)

आप स्काला में यह है, तो:

+०१२३५१६४१०
//Scala 
object CommonControler { 
     val FORMATED_TIME = "formatedTime"; 
} 

आप इसे इस तरह जावा

//Java 

// Variables become methods 
CommonControler$.MODULE$.FORMATED_TIME(); 
// A static forwarder is avaliable 
CommonControler.FORMATED_TIME(); 

से का उपयोग इसके अलावा पुस्तक Scala in Depth

यह भी ध्यान रखें कक्षाओं के लिए @scala.reflect.BeanProperty देख सकते हैं।

+0

मुझे इसे फिर से जांचना है - क्योंकि मैं फॉरवर्डर गायब हूँमेरे द्वारा बनाई गई दूसरी कक्षा में मेरे पास एक अग्रदूत था। – Martin

+1

मुझे लगता है कि मैंने इसे समझ लिया। यदि आपके पास क्लास कॉमनकंट्रोलर है और ऑब्जेक्ट कॉमनकंट्रोलर है तो आपको स्थिर फॉरवर्डर्स नहीं मिलते हैं :-(। – Martin

1

मुझे डिकंपील्ड कोड में एक और नजर डाली और कुछ और नोट किया। चर वास्तव में स्थिर नहीं हैं। तो मेरी अगली विचार के बजाय एक वस्तु का इस्तेमाल किया गया:

object KommenControler 
{ 
    val FORMATED_TIME = "formatedTime"; 
} // KommenControler 

लेकिन अब चीजें वास्तव में बदसूरत बारी:

public final class ….KommenControler$ extends java.lang.Object implements scala.ScalaObject{ 

public static final ….KommenControler$ MODULE$; 

private final java.lang.String FORMATED_TIME; 

public static {}; 
    Code: 
    0: new #9; //class …/KommenControler$ 
    3: invokespecial #12; //Method "<init>":()V 
    6: return 

public java.lang.String FORMATED_TIME(); 
    Code: 
    0: aload_0 
    1: getfield #26; //Field FORMATED_TIME:Ljava/lang/String; 
    4: areturn 

तो मैं $ जो एक सिंगलटन उदाहरण moudle $ कहा जाता है को समाप्त होने वाले एक अतिरिक्त वर्ग मिलता है। और अभी भी इंस्पेक्टर है। तो एक jsp अंदर चर के लिए उपयोग हो जाता है:

final String formatedTime = (String) request.getAttribute (….KommenControler$.MODULE$.FORMATED_TIME()); 

यह काम करता है की उम्मीद है और मैं व्यक्तिगत रूप से इसके साथ रह सकते हैं, लेकिन कैसे मैं टीम से है कि समझाने जा रहा हूँ के रूप में?

बेशक अगर कोई आसान तरीका है तो मैं इसे सुनना पसंद करता हूं।

+1

आपको इसे बदसूरत लेकिन आवश्यक कॉल को सारणी देने के लिए एक अच्छी जावा वस्तु में लपेटना चाहिए। असल में, जावा में, आपको संकलन में इनलाइन होने से बचने के लिए विधि कॉल में सार्वजनिक स्थिर अंतिम स्थिरांक को हमेशा समाहित करना चाहिए। – paradigmatic

+0

यह उत्तर देखें: http://stackoverflow.com/questions/3282653/how-do-you-call-a-scala-singleton-method-from-java/3445597#3445597 – oluies