2013-08-27 3 views
13

मुझे अभी एहसास हुआ कि मुझे स्कैला में एनोटेशन नहीं हो सकते हैं, जिन्हें रनटाइम पर संरक्षित और विश्लेषण किया जाता है। मैंने this question भी चेक किया, लेकिन मुझे यह नहीं मिला कि विकल्प क्या हैं।रनटाइम-संरक्षित एनोटेशन के लिए स्कैला विकल्प क्या है

  • DI - एक उत्तर में उल्लेख किया गया है कि स्केल में डी ढांचे की कोई आवश्यकता नहीं है। हालांकि यह मूल स्तर पर मामला हो सकता है (हालांकि मुझे that example पसंद नहीं आया; डीआई को संभालने का बेवकूफ तरीका क्या है?), जावा डी फ्रेमवर्क जैसे वसंत की तरह बहुत उन्नत हैं और कई चीजें हैं जैसे अनुसूचित नौकरियां, कैशिंग, प्रबंधित दृढ़ता , आदि, एनोटेशन के माध्यम से, और कभी-कभी - कस्टम वाले।

  • ओआरएम - मैं मानता हूं कि मैंने किसी भी देशी स्कैला ओआरएम की कोशिश नहीं की है, लेकिन जो मैं स्क्वायरल में देखता हूं, उससे भी एनोटेशन का कुछ उपयोग होता है, जिसका अर्थ है कि वे अपरिहार्य हैं?

  • कोई धारावाहिक उपकरण - आप जेएसओएन/एक्सएमएल/... में क्रमबद्ध रूप से धारावाहिक आउटपुट को कैसे अनुकूलित करते हैं?

  • वेब सेवा ढांचे - आप रीस्टफुल या एसओएपी सेवाओं के लिए मैपिंग, हेडर इत्यादि को कैसे परिभाषित करते हैं?

स्काला उपयोगकर्ताओं इन सुविधाओं है कि जावा से आ रहे हैं का उपयोग करने के एक संकर स्केला/जावा (एनोटेशन के लिए) परियोजना की आवश्यकता है?

और एनोटेशन से मेटा-डेटा निकर के लिए देशी स्केल विकल्प हैं? मैं अभी तक पूरी तरह सोच के स्केला मोड में नहीं कर रहा हूँ, और इसलिए उदाहरण के सबसे मेरे लिए बदसूरत देखो, टिप्पणियों का उपयोग करने की तुलना में है, तो अतिरिक्त कायल :)

उत्तर

8

वास्तव में, होने के लिए स्काला प्रयास करें क्रम है पूर्ववर्ती एनोटेशन। अंतर यह है कि उन्हें जावा एनोटेशन के रूप में संग्रहीत नहीं किया जाता है, बल्कि इसके बजाय बाइनरी ScalaSignature एनोटेशन (जो स्वयं, एक रनटाइम-बनाए रखा जावा एनोटेशन) की सामग्री के अंदर एन्कोड किया जाता है।

तो, स्काला एनोटेशन रनटाइम पर पुनः प्राप्त किया जा सकता है, लेकिन जावा प्रतिबिंब का उपयोग कर के बजाय एक स्काला प्रतिबिंब का उपयोग करना चाहिए:

class Awesome extends StaticAnnotation 

@Awesome 
class AwesomeClass 

import scala.reflect.runtime.universe._ 

val clazz = classOf[AwesomeClass] 
val mirror = runtimeMirror(clazz.getClassLoader) 
val symbol = mirror.classSymbol(clazz) 
println(symbol.annotations) // prints 'List(Awesome)' 

दुर्भाग्य से, स्काला प्रतिबिंब अभी भी प्रयोगात्मक रूप में चिह्नित किया जाता है और इस बिंदु पर वास्तव में अस्थिर है (SI-6240 या SI-6826 काफी गंभीर मुद्दों के उदाहरण हैं)। फिर भी, यह लंबे समय में जावा प्रतिबिंब और एनोटेशन के लिए सबसे सरल प्रतिस्थापन की तरह लगता है।

अभी तक, किसी को जावा एनोटेशन का उपयोग करना है जो मुझे लगता है कि अभी भी एक अच्छा समाधान है।

डीआई/ओआरएम/डब्ल्यूएस/क्रमबद्धता के लिए ढांचे और पुस्तकालयों के संबंध में - स्कैला अभी भी इस क्षेत्र में परिपक्व प्रतीत नहीं होता है, कम से कम जावा के रूप में नहीं। इन समस्याओं को लक्षित करने वाली कई चल रही परियोजनाएं हैं, उनमें से कुछ पहले से ही वास्तव में अच्छी हैं, अन्य अभी भी विकास में हैं। मेरे दिमाग में आने वाले कुछ लोगों का नाम: Squeryl, Slick, Spray, Pickling

इसके अलावा, स्कैला में कुछ उन्नत विशेषताएं हैं जो प्रायः एनोटेशन को अनचाहे बनाती हैं। टाइपक्लास (अंतर्निहित पैरामीटर के साथ लागू) शायद इसका अच्छा उदाहरण हैं।

+0

http://stackoverflow.com/questions/2265773/how-do-you-define-an-interface-in-scala कहते हैं स्टेटिकएनोटेशन रनटाइम पर संरक्षित नहीं है।क्या इसका मतलब "जावा रनटाइम" है? – Bozho

+0

@ बोझो मुझे ऐसा लगता है। यह तीन साल पहले एक प्रश्न है जब स्कैला प्रतिबिंब अभी तक अस्तित्व में नहीं था। – ghik

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