2011-10-19 7 views
11

स्काला में, हमस्कैला ऑब्जेक्ट के जावा समकक्ष क्या है?

object Foo { def bar = {} } 

यह कैसे संकलक द्वारा कार्यान्वित किया जाता है लिख सकता है? मैं जावा से जावा लेकिन new Foo(); से Foo.bar(); फोन करने में सक्षम हूँ त्रुटि cannot find symbol symbol: constructor Foo()

  • देशी रूप JVM समर्थन एकमात्र करता है देता है?
  • क्या जावा में कक्षा होना संभव है जिसमें कोई कन्स्ट्रक्टर नहीं है?

नोट: यहाँ से एकमात्र के लिए scalac -print

package <empty> { 
    final class Foo extends java.lang.Object with ScalaObject { 
    def bar(): Unit =(); 
    def this(): object Foo = { 
     Foo.super.this(); 
    () 
    } 
    } 
} 

उत्तर

11

समर्थन कोड उत्पादन एक भाषा के स्तर पर नहीं है, लेकिन भाषा कोई परेशानी के बिना उन्हें बनाने के लिए पर्याप्त सुविधाएं प्रदान करता है।

public class Singleton { 
    private static final Singleton instance = new Singleton(); 

    // Private constructor prevents instantiation from other classes 
    private Singleton() {} 

    public static Singleton getInstance() { 
     return instance; 
    } 
} 

यह विकिपीडिया, जो बताते हैं कि कैसे एक सिंगलटन बनाया जा सकता है से एक उदाहरण है:

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

निर्माताओं के लिए के रूप में: डिफ़ॉल्ट रूप से हर वर्ग एक तथाकथित डिफ़ॉल्ट निर्माता जो कोई तर्क सुपर क्लास का कोई-args निर्माता कॉल लेता है और बस है। यदि सुपरक्लास के पास तर्क के बिना कोई सुलभ कन्स्ट्रक्टर नहीं है, तो आपको एक स्पष्ट कन्स्ट्रक्टर लिखना होगा।

तो एक वर्ग में एक कन्स्ट्रक्टर होना चाहिए, लेकिन अगर आपको सुपरक्लास के पास कोई तर्क नहीं है तो आपको इसे लिखना नहीं है।

public final class Foo { 
    private Foo() {} // Actually, Foo doesn't have constructor at all 
        // It can be represented in bytecode, 
        // but it cannot be represented in Java language 

    public static final void bar() { 
     Foo$.MODULE$.bar(); 
    } 
} 

public final class Foo$ implements ScalaObject { 
    public static final Foo$ MODULE$; 
    static { 
     new Foo$(); 
    } 
    private Foo$() { MODULE$ = this; } 
    public final void bar() { 
     // actual implementation of bar() 
    } 
} 

यहाँ Foo$, एक सिंगलटन का एक वास्तविक कार्यान्वयन है जबकि Foo जावा के साथ बातचीत के लिए एक तरीका प्रदान करता है static:

+0

आह:

इस प्रश्न देखें। – Jus12

21

जब आपके कोड संकलन, स्काला संकलक निम्नलिखित जावा कोड के किसी समान पैदा करता है।

+0

क्या आपने दिखाया है कि "इंटरमीडिएट" जावा कोड देखने का कोई तरीका है? क्या आपने इसे उत्पन्न करने के लिए एक डीकंपलर का उपयोग किया था? – Jus12

+1

@ जुस 12: शायद कुछ डीकंपलर इसे दिखाने में सक्षम हैं, लेकिन मैंने इसे 'javap -c -private foo'/'javap -c -private Foo $' के आउटपुट से मैन्युअल रूप से पुनर्निर्मित किया है। – axtavt

4

जोशुआ ब्लोच ने "प्रभावशाली जावा" पुस्तक में एक सिंगलटन को लागू करने के लिए एक enum के उपयोग में पुनः संयोजित किया। तो चाल निर्माता निजी बनाने के लिए है What is an efficient way to implement a singleton pattern in Java?