2009-01-26 11 views
17

जावा में या कि इस सुविधा का उपयोग करता है किसी भी अन्य भाषा में स्थानीय कक्षाओं का लाभ क्या है?लाभ जावा

उत्तर

10

वे आपको माता-पिता कक्षा से बाहर तर्क लेते हैं और इसे objectify करने देते हैं। यह कार्यक्षमता को हटा देता है जहां से यह संबंधित नहीं है और इसे अपनी कक्षा में रखता है। लेकिन क्या होगा यदि यह नया ऑब्जेक्ट केवल थोड़े समय के लिए आवश्यक है, केवल कोड के एक ब्लॉक की अवधि के लिए? ठीक है, कि जहां एक स्थानीय कक्षा में फिट बैठता है है।

+2

यह ऑब्जेक्ट इंस्टेंस की अवधि इतनी अधिक नहीं है, लेकिन इसका दायरा है। यदि वर्ग को केवल मूल वर्ग के लिए दृश्यमान होने की आवश्यकता है, तो इसे स्थानीय बनाने से इसे कहीं और इस्तेमाल होने से रोका जाएगा। साथ ही, स्थानीय वर्ग माता-पिता के निजी सदस्यों को देख सकता है - एक गैर-स्थानीय वर्ग ऐसा नहीं कर सकता है। – belugabob

+7

@belugabob: 1. स्थानीय कक्षाओं का उपयोग केवल उस विधि या निर्माता के अंदर किया जा सकता है जिसमें उन्हें परिभाषित किया गया है। वे संलग्न वर्ग के लिए भी दिखाई नहीं दे रहे हैं। 2. नेस्टेड/भीतरी कक्षाएं संलग्न कक्षा के निजी चर भी देख सकती हैं। –

24

यहाँ कैसे एक गुमनाम आंतरिक वर्ग, एक स्थानीय भीतरी वर्ग, और एक नियमित रूप से आंतरिक वर्ग एक कार्यक्रम में मौजूद हो सकता है, इसका एक उदाहरण। उदाहरण के एक myMethod विधि और एक InnerClass वर्ग MyClass वर्ग में वर्तमान में लग रही है। चर्चा के लिए, उन वर्गों सब Runnable इंटरफेस को लागू किया जाएगा:

public class MyClass 
{ 
    public void myMethod() 
    { 
     // Anonymous inner class   
     Runnable r = new Runnable() { 
      public void run() {} 
     }; 

     // Local inner class 
     class LocalClass implements Runnable 
     { 
      public void run() {} 
     } 
    } 

    // ... // 

    // Inner class 
    class InnerClass implements Runnable 
    { 
     public void run() {} 
    } 
} 

गुमनाम आंतरिक वर्ग बस वास्तव में वर्ग को लिखने के लिए बिना एक वर्ग है कि Runnable लागू करता है बनाने के लिए किया जा सकता है और इसका नामकरण, और krosenvold के रूप में उनके पद में उल्लेख किया गया है, इसका उपयोग जावा में "गरीब व्यक्ति के बंद होने" के रूप में किया जाता है।

उदाहरण के लिए, एक बहुत ही बहुत आसान तरीका एक गुमनाम आंतरिक वर्ग का उपयोग कर होगा एक Thread शुरू करने के लिए:

new Thread(new Runnable() { 
    public void run() 
    { 
     // do stuff 
    } 
}).start(); 

एक स्थानीय भीतरी वर्ग एक वर्ग है कि स्थानीय दायरे के भीतर है बनाने के लिए इस्तेमाल किया जा सकता - myMethod के बाहर अन्य विधियों से इसे एक्सेस नहीं किया जा सकेगा।

अगर वहाँ एक और तरीका था और हम LocalClass कि myMethod विधि के अंदर स्थित है का एक उदाहरण करने की कोशिश की है, हम ऐसा करने में सक्षम नहीं होगा:

public void anotherMethod() 
{ 
    // LocalClass is out of scope, so it won't be found, 
    // therefore can't instantiate. 
    new Thread(new LocalClass()).start(); 
} 

एक भीतरी वर्ग है वर्ग है कि आंतरिक वर्ग में स्थित है का हिस्सा है। तो, उदाहरण के लिए, आंतरिक वर्ग InnerClass अन्य वर्गों से MyClass.InnerClass द्वारा पहुँचा जा सकता। बेशक, इसका मतलब यह भी है कि MyClass में एक और विधि एक भीतरी कक्षा को तुरंत चालू कर सकती है।

public void myMethod() 
{ 
    // Variable to access from anonymous and local inner classes. 
    final int myNumber = 42; 

    // Anonymous inner class   
    Runnable r = new Runnable() { 
     public void run() 
     { 
      System.out.println(myNumber); // Works 
     } 
    }; 

    // Local inner class 
    class LocalClass implements Runnable 
    { 
     public void run() 
     { 
      System.out.println(myNumber); // Works 
     } 
    } 

    // ... // 

तो, फायदे क्या हैं:

public void anotherMethod() 
{ 
    // InnerClass is part of this MyClass. Perfectly instantiable. 
    new Thread(new InnerClass()).start(); 
} 

गुमनाम आंतरिक वर्ग और स्थानीय भीतरी वर्ग के बारे में एक और बात यह है कि यह final चर जो myMethod घोषित किये गए हैं का उपयोग करने में सक्षम हो जाएगा है? अज्ञात आंतरिक कक्षाओं और स्थानीय आंतरिक कक्षाओं का उपयोग एक अलग पूर्ण उड़ा हुआ आंतरिक वर्ग या कक्षा होने के बजाय पूर्व को final चर तक पहुंचने की अनुमति देता है जिसमें वे घोषित किए जाते हैं, और साथ ही, कक्षाएं स्थानीय हैं विधि स्वयं, इसलिए इसे उसी वर्ग के भीतर बाहरी कक्षाओं और अन्य विधियों से नहीं पहुंचा जा सकता है।

12

चीजें हैं जो आप स्थानीय कक्षाओं कि आप अनाम भीतरी वर्गों के साथ नहीं मिलता है के साथ कर सकते की एक संख्या हैं।

  • क्योंकि प्रकार एक नाम है, आप और अधिक उपयोगी महाप्रकार
  • किसी दिए गए नाम ढेर कर सकते हैं आसान निशान एक आधार की तुलना में अधिक का पालन करने के (विशेष रूप से ताला वस्तुओं के लिए)
  • उप-प्रकार में नहीं सदस्य जोड़ सकते हैं टाइप एक से अधिक जगह में
  • निर्माण, और कई निर्माताओं

दूसरी ओर वे कुछ घोर रूप से वर्बोज़ वाक्य रचना भी मेसियर बनाते हैं।

+0

# 2 और # 3 एकमात्र कारण हैं जिन्हें मैंने कभी भी व्यक्तिगत रूप से उपयोग किया है। –

+0

(यदि यह # 1 जैसा नहीं है) जैसे उनके नाम हैं, तो आप उन्हें बार-बार उपयोग कर सकते हैं। इसके अलावा, बिंदु 3 अच्छा है। –

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