जावा 7 में बंद [बंद]


105

क्लोजर क्या है? इसे जावा 7. में शामिल किया जाना है (जावा 7 में शामिल करने के लिए क्लोजर पर चर्चा की गई थी, लेकिन अंत में इसे शामिल नहीं किया गया था।-)) क्या कोई मुझे कुछ विश्वसनीय संदर्भ प्रदान कर सकता है जहां से मैं क्लोजर के बारे में सामान सीख सकता हूं?

जवाबों:


59

यहाँ नील गेयर का ब्लॉग है जो कि अग्रदूतों में से एक है। 28 जनवरी, 2007 से बंद होने वाले उनके पोस्ट का नाम ए डेफिन्ट ऑफ क्लोजर है । उनके ब्लॉग पर आपको वीडियो के साथ-साथ शुरुआत करने के लिए बहुत सारी जानकारी है। यहाँ एक उत्कृष्ट Google टॉक है - एडवांस्ड टॉपिक्स इन प्रोग्रामिंग लैंग्वेजेस - क्लोज़र फॉर जावा विद नेल गेयर, साथ ही।


2
क्या आपके पास समग्र ब्लॉग की तुलना में अधिक विशिष्ट लिंक है?
I82Much

2
यह कोशिश करें। इसके बाद gb.blogspot.co.uk/2007/01/definition-of-closures.html
लिडा राल्फ

1
अगर कोई मेरे जैसे गूंगा है और सिर्फ इतना पता है अगर आप दीवार के खिलाफ अपने सिर की धड़कन रहे हैं हैक इस बंद है .... तो ये रहा .. youtube.com/watch?v=Nj3_DMUXEbE
पीयूष Kukadiya

मैं उस भाषा में बंद करने की कल्पना नहीं कर सकता जो शुरू में उनके पास नहीं थी..किंडा पागल
अलेक्जेंडर मिल्स

अलेक्जेंडर मिल्स बस जिज्ञासु .. क्यों?
बार्टज़िला

84

एक कोड कोड का एक खंड है जिसे संदर्भित किया जा सकता है (और चारों ओर पारित किया गया है) जो एन्कोडिंग स्कोप के चर तक पहुंच के साथ है।

जावा 1.1 के बाद से, अनाम आंतरिक वर्ग ने अत्यधिक सुविधा के साथ इस सुविधा को प्रदान किया है। उनके पास केवल finalस्थानीय चर का उपयोग करने में सक्षम होने (और निश्चित रूप से असाइन किए गए) का प्रतिबंध है । (नोट, यहां तक ​​कि गैर-final स्थानीय चर भी दायरे में हैं, लेकिन इसका उपयोग नहीं किया जा सकता है।)

जावा एसई 8 को एकल-विधि इंटरफेस * के लिए इसका अधिक संक्षिप्त संस्करण कहा जाता है, जिसे "लंबदा" कहा जाता है। लैम्ब्डा में अनाम आंतरिक कक्षाओं के समान ही प्रतिबंध हैं, हालांकि कुछ विवरण यादृच्छिक रूप से भिन्न होते हैं।

लैम्ब्डा को प्रोजेक्ट लाम्बा और जेएसआर 335 के तहत विकसित किया जा रहा है ।

* मूल रूप से डिजाइन अधिक लचीला था जो एकल सार विधियों (एसएएम) प्रकारों की अनुमति देता है। दुर्भाग्य से नया डिज़ाइन कम लचीला है, लेकिन इंटरफेस के भीतर कार्यान्वयन की अनुमति देने का औचित्य साबित करने का प्रयास करता है।


7

टॉम हॉकिन के अनुसार

क्लोजर कोड का एक ब्लॉक है जिसे संदर्भित किया जा सकता है (और चारों ओर पारित किया गया) जो एन्क्लेविंग स्कोप के चर तक पहुंच के साथ है।

अब मैं पर JavaScript बंद उदाहरण का अनुकरण करने के लिए कोशिश कर रहा हूँ विकिपीडिया , एक "के साथ straigth उपयोगी होने के लिए, जावा के लिए" अनुवाद आशा में:

//ECMAScript
var f, g;
function foo() {
  var x = 0;
  f = function() { return ++x; };
  g = function() { return --x; };
  x = 1;
  print('inside foo, call to f(): ' + f()); // "2"  
}
foo();
print('call to g(): ' + g()); // "1"
print('call to f(): ' + f()); // "2"

अब जावा भाग: फंक्शन 1 "फनकार" है जिसका अर्थ है एरिटी 1 (एक तर्क)। क्लोजर फ़ंक्शन 1 को लागू करने वाला वर्ग है, एक ठोस फ़नकार जो फ़ंक्शन (इंट -> इंट) के रूप में कार्य करता है। जावास्क्रिप्ट उदाहरण से कॉल की नकल करते हुए मुख्य () विधि में मैं सिर्फ एक क्लोजर ऑब्जेक्ट के रूप में फू को इंस्टेंट करता हूं। इंटॉक्स क्लास सिर्फ एक साधारण कंटेनर है, यह 1 इंट के सरणी की तरह व्यवहार करता है:

int [1] = {0}

interface Function1   {
    public final IntBag value = new IntBag();
    public int apply();
}

class Closure implements Function1 {
   private IntBag x = value;
   Function1 f;
   Function1 g;

   @Override
   public int apply()  {
    // print('inside foo, call to f(): ' + f()); // "2"
    // inside apply, call to f.apply()
       System.out.println("inside foo, call to f.apply(): " + f.apply());
       return 0;
   }

   public Closure() {
       f = new Function1() {
           @Override
           public int apply()  {
               x.add(1);
                return x.get();
           }
       };
       g = new Function1() {
           @Override
           public int apply()  {
               x.add(-1);
               return x.get();
           }
       };
    // x = 1;
       x.set(1);
   }
}
public class ClosureTest {
    public static void main(String[] args) {
        // foo()
        Closure foo = new Closure();
        foo.apply();
        // print('call to g(): ' + g()); // "1"
        System.out.println("call to foo.g.apply(): " + foo.g.apply());
        // print('call to f(): ' + f()); // "2"
        System.out.println("call to foo.f.apply(): " + foo.f.apply());

    }
}

यह प्रिंट करता है:

inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2 

2
IMO नाम के अलावा इसका क्लोजर से कोई लेना-देना नहीं है
n00b


4

जावा क्लोजर J2SE 8 का हिस्सा बनने जा रहा है और इसे 2012 के अंत तक रिलीज़ करने की तैयारी है।

जावा 8 के क्लोजर सपोर्ट में लैंबडा एक्सप्रेशंस, मेथड रेफरेंस, कंस्ट्रक्टर रेफरेंस और डिफॉल्ट मेथड्स के कॉन्सेप्ट शामिल हैं।

इसके लिए अधिक जानकारी और काम करने के उदाहरण के लिए कृपया देखें: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html


1
हम्म, हालांकि जावा 8 क्लोजर वेरिएबल के संशोधन की अनुमति नहीं देता है। अच्छा लेख।
नवफाल

3

हां, क्लोजर (लैम्ब्डा एक्सप्रेशंस) आगामी जावा एसई 8 रिलीज के साथ नई सुविधा है। आप इसके बारे में अधिक जानकारी नीचे दिए गए लिंक से प्राप्त कर सकते हैं: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html


0

जावा 5, 6 और 7 के लिए एक क्लोजर कार्यान्वयन

http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html

इसमें सभी एक के लिए पूछ सकते हैं ...


लिंक यह वर्णन करने वाले कुछ पाठ पर जाता है लेकिन उस पृष्ठ से लिंक किया गया कोड मौजूद नहीं है। कार्यान्वयन कहां है?
जेरी यिर्मयाह

@JerryJeremiah यह यहाँ है, इसका अलग-अलग नाम है, अब भी सभी संस्करण जो मौखिक रूप से मौजूद हैं, वे नहीं हैं (गैर-अंतिम पहुंच का समर्थन करने के लिए और अमूर्त वर्गों के माध्यम से और अधिक, यह फिर से जोड़ा जा सकता है <जावा 8 संस्करणों के लिए, आप किस मंच पर हैं? की तलाश में;): bitbucket.org/momomo/opensource/src
mmm

2
लिंक टूट रहे हैं!
sunleo

मैं एक 404 कड़ी मर गया है
अलेक्जेंडर मिल्स

लिंक टूट गया (यही कारण है कि हमें लिंक को जवाब के रूप में नहीं डालना चाहिए ...)
ओएचडीआर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.