2009-02-05 7 views
9

जावा में विधियों के साथ "यह" का उपयोग करने के बारे में क्या? क्या यह वैकल्पिक है या ऐसी स्थितियां हैं जब किसी को इसे अनिवार्य रूप से उपयोग करने की आवश्यकता होती है?विधियों (जावा में) के साथ "यह" का उपयोग

एकमात्र स्थिति का सामना करना पड़ा है जब कक्षा में आप किसी विधि के भीतर एक विधि का आह्वान करते हैं। लेकिन यह वैकल्पिक है।

public class Test { 

    String s; 

    private String hey() { 
     return s; 
    } 

    public String getS(){ 
     String sm = this.hey(); 
     // here I could just write hey(); without this 
     return sm; 
    } 
} 
+0

उम, मैं http://stackoverflow.com/questions/516291/the-use-of- के आधार पर बंद करने से सुझाव इन-इन-जावा लेकिन मुझे अब नहीं लगता कि वे काफी करीब हैं। –

+0

मुझे समझ में आया है कि "यह" क्या मतलब है- "एकल" का उपयोग तब किया जा सकता है यदि आप ऑब्जेक्ट के पूरे वर्तमान उदाहरण, या ऑब्जेक्ट के किसी भी तत्व, यानी this.instanceVar को संदर्भित करना चाहते हैं। लेकिन कभी-कभी आपको उपयोग करने की आवश्यकता होती है "यह" - निर्माता में, यदि तर्क समान है: this.var = var.But तरीकों के लिए? – user42155

+0

मैंने यह दिखाने के लिए अपना जवाब अपडेट कर दिया है कि एक ही कारण में, यह एक विधि में भी आवश्यक हो सकता है। पैरामीटर नाम बदलना इसके लिए आवश्यकता को हटा देता है, हालांकि। –

उत्तर

2

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

लेकिन नहीं। जब तक टकराव नामकरण के दायरे के कारण असंबद्धता की आवश्यकता नहीं होती है, तो आपको वास्तव में "यह" की आवश्यकता नहीं होती है।

+0

यदि आप एक उदाहरण या कक्षा विधि कॉल कर रहे हैं तो "यह" कैसे स्पष्ट करता है? दोनों कानूनी हैं। –

+0

यह एक संकेत है - एक कोडिंग निर्माण कानूनी रूप से अधिक बाध्य परिस्थितियों के तहत लगातार या मानकीकृत उपयोग द्वारा अतिरिक्त अर्थ दिया गया है। –

+0

लेकिन "यह" स्थैतिक तरीकों, उदाहरण विधियों और सुपर के तरीकों के लिए काम करेगा, इसलिए जब तक कि कोई आपके विशिष्ट संकेत नियमों को नहीं जानता, यह बिल्कुल तब तक नहीं है। असल में यह आपके कोड को समझने में भी मुश्किल बनाता है। –

0

एकमात्र समय वास्तव में आवश्यक है जब आपके पास सदस्य चर के समान नाम वाले विधि के लिए पैरामीटर हो। निजी तौर पर, मैं चर/चर विधि के दायरे को स्पष्ट करने के लिए हमेशा इसका उपयोग करने की कोशिश करता हूं। उदाहरण के लिए आप एक स्थिर विधि या एक उदाहरण विधि हो सकती है। कोड पढ़ने पर यह जानना उपयोगी हो सकता है कि कौन सा है।

+0

सत्य नहीं है, चर और विधियां अलग-अलग नाम रिक्त स्थान पर हैं। –

+0

मेरा मतलब पैरामीटर और सदस्य चर के बीच असंबद्ध होना था और स्थिर और एक आवृत्ति विधि, चर और विधियों के बीच नहीं है। – tvanfosson

33

तीन स्पष्ट स्थितियों में, जहां आप इसे की जरूरत है:

  • अपने निर्माता
  • एक स्थानीय चर और एक उदाहरण चर के बीच अंतर करना (निर्माता में या के पहले भाग के रूप में एक ही कक्षा में एक और निर्माता कॉलिंग किसी भी अन्य विधि)
  • एक और तरीका

यहाँ करने के लिए वर्तमान ऑब्जेक्ट के संदर्भ पासिंग इन तीनों का एक उदाहरण है:

public class Test 
{ 
    int x; 

    public Test(int x) 
    { 
     this.x = x; 
    } 

    public Test() 
    { 
     this(10); 
    } 

    public void foo() 
    { 
     Helper.doSomethingWith(this); 
    } 

    public void setX(int x) 
    { 
     this.x = x; 
    } 
} 

मेरा मानना ​​है कि वहाँ भी इनर क्लासों जहां IMO जरूरत super.this.x लेकिन वे बेहद अस्पष्ट रूप से बचा जाना चाहिए, :) का उपयोग कर कुछ अजीब स्थितियों रहे हैं

संपादित करें: मैं किसी भी उदाहरण नहीं सोच सकते हैं तुम क्यों इसे सीधे this.foo() विधि कॉल के लिए चाहिए।

संपादित करें:

मुझे लगता है कि अस्पष्ट मामला है:: OuterClass.this.foo() जब एक इनर कक्षा में कोड से बाहरी वर्ग के foo() तक पहुँचने है कि एक saua अस्पष्ट भीतरी वर्ग उदाहरण के मामले पर इस योगदान foo() विधि भी।

+0

'नया' केस का उपयोग करके एक विधि संदर्भ बनाने के लिए एक नया उपयोग केस है, उदाहरण के लिए, 'रननेबल आर = यह :: foo; '। – shmosel

2

अधिकांश सामान्य प्रोग्रामिंग के लिए, this कीवर्ड वैकल्पिक है और आमतौर पर भ्रम से बचने के लिए उपयोग किया जाता है। हालांकि, ऐसे कुछ स्थान हैं जहां इसकी आवश्यकता है।

class Foo { 
    int val; 

    public Foo(int val) { 
     this(val, 0); //this MUST be here to refer to another constructor 
    } 

    public Foot(int val, int another) { 
     val = val;  //this will work, but it generally not recommended. 
     this.val = val; //both are the same, but this is more useful. 
     method1();  //in a Foo instance, it will refer to this.method1() 
     this.method1(); //but in a Foo2 instance, you must use this to do the same 
    } 

    public void method1() {} 
} 

class Foo2 extends Foo { 
    public Foo2(int val) { 
     this(val);  //this will refer to the other Foo2 constructor 
    } 
    public Foo2(int val, int another) { 
     super(val, another); 
     super.method1(); //this will refer to Foo.method1() 
    } 

    @Override 
    public void method1() {}//overridden method 
} 

ये सभी मामले नहीं हैं, लेकिन कुछ सामान्य हैं। मुझे आशा है कि इससे आपको this और super कीवर्ड और उन्हें कब/कब उपयोग करना बेहतर समझने में मदद मिलेगी।

+0

यह। Method1() कक्षा प्रकार के method1() को कॉल करेगा, इसलिए "यह" कोई फर्क नहीं पड़ता है। –

+2

बीटीडब्ल्यू, जैसा कि अन्य लोगों ने ऊपर टिप्पणी की, वैल = वैल; इस उदाहरण में निर्माता में, वांछित प्रभाव नहीं देंगे। प्रोग्राम संकलित करता है, लेकिन इंस्टेंस चर को कभी भी कन्स्ट्रक्टर में प्रारंभ नहीं किया जाएगा। डिफ़ॉल्ट कन्स्ट्रक्टर से यह हमेशा 0 होगा। – user42155

0

कोई जवाब नहीं है (इसलिए इसे वोट करने के लिए स्वतंत्र महसूस करें), लेकिन मैं इसे किसी टिप्पणी में फिट नहीं कर सका जहां कोई पूछ रहा था।

बहुत से लोग इसका उपयोग करते हैं।एक्स "नेत्रहीन स्थानीय चर और मानकों से उदाहरण चर अंतर करने के लिए

तो वे ऐसा होगा:।

private int sum; 
public int storeSquare (int b) { 
    int c=b*b; 
    this.sum+=c; // Makes sum "pop" I guess 
    return c; 
} 
निजी तौर पर मुझे लगता है कि यह एक बुरी आदत है

: किसी भी प्रयोग करने योग्य संपादक एक अलग में उदाहरण और स्थानीय चर डाल देंगे आपके लिए रंग विश्वसनीय रूप से - इसे किसी भी मानव-गिरावट वाले पैटर्न की आवश्यकता नहीं है।

इसे "यह" के साथ करना। केवल 50% सुरक्षित है। निश्चित रूप से संकलक इसे पकड़ लेगा यदि आप इसे x.x को रखने का प्रयास करते हैं एक स्थानीय चर है, लेकिन ऐसा कुछ भी नहीं है जो आपको "फोर्जेटिंग" से रोकने के लिए एक इंस्टेंस वैरिएबल को टैग करने से रोक देगा।, और यदि आप भूल जाते हैं केवल एक टैग करें (या यदि कोई अन्य आपके कोड पर काम करता है) और आप पैटर्न पर भरोसा कर रहे हैं, तो पैटर्न अच्छा

व्यक्तिगत रूप से मुझे यकीन है कि पैटर्न प्रोग्रामर (सही) असुविधा से उत्पन्न होता है तथ्य यह है कि इस मामले में:

public void setMe(int me) { 
    this.me=me; 
} 

तथ्य यह है कि आप की जरूरत है "यह।" मेरे सामने पैरामीटर का नाम से निर्धारित होता है - मैं मानता हूँ कि यह सिर्फ लापरवाही से महसूस करता है। आप लगातार रहना चाहते हैं - अगर आपको इसकी ज़रूरत है। मेरे सामने, हमेशा इसका उपयोग क्यों नहीं करते?

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

public void setMe(int pMe) 
0

एक विधि मंगलाचरण के सामने this पहले जोड़ें करने के लिए एकमात्र कारण संकेत मिलता है कि आप कर रहे हैं है एक गैर स्थैतिक विधि बुलाओ। मैं ऐसा करने के किसी अन्य वैध कारण के बारे में नहीं सोच सकता (मुझे सही करें मैं गलत हूं)। मैं इस सम्मेलन की सिफारिश नहीं करता क्योंकि इसमें अधिक मूल्य नहीं है। यदि लगातार लागू नहीं किया जाता है तो यह भ्रामक हो सकता है (क्योंकि इस कम विधि के आमंत्रण अभी भी एक गैर स्थैतिक विधि हो सकता है)। यदि विधि लागू की जा रही है तो यह कितनी बार सावधानी बरतता है या नहीं? इसके अलावा, अधिकांश आईडीई स्थिर तरीकों को अलग-अलग हाइलाइट करेंगे।

मैंने उन सम्मेलनों के बारे में सुना है जहां thisthis की अनुपस्थिति के दौरान उप वर्ग की विधि को कॉल करने का संकेत देता है, सुपर क्लास की विधि को कॉल कर रहा है। लेकिन यह सिर्फ मूर्खतापूर्ण है क्योंकि सम्मेलन चारों ओर एक और तरीका हो सकता है।

संपादित करें: जैसा कि mmyers बताते हैं (टिप्पणी देखें), this स्थिर तरीकों के साथ काम करता है। इसके साथ, मुझे this के साथ प्रीपेन्ड करने का कोई कारण नहीं है क्योंकि इससे कोई फर्क नहीं पड़ता है।

+0

"यह" स्थैतिक विधियों के साथ भी काम करता है, जिससे वास्तव में मदद नहीं मिलती है। –

+0

फिर "इस" का उपयोग करने का बिल्कुल कोई कारण नहीं है। –

+0

'यह 'स्थिर तरीकों के साथ काम करता है, लेकिन यह एक चेतावनी उत्पन्न करता है (कम से कम मेरी सेटिंग्स के साथ)। तो यह उपयोगी हो सकता है, लेकिन यह कुछ वाक्यविन्यास हाइलाइटिंग के लिए बहुत अधिक बॉयलरप्लेट है जो आपको वैसे भी देता है। – maaartinus

0

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuilder.html

आप बिल्कुल इस की जरूरत है अपने विधि वस्तु के उदाहरण वापस जाने के लिए की जरूरत है।

public class StringBuildable { 
    public StringBuildable append(String text) { 
     // Code to insert the string -- previously this.internalAppend(text); 
     return this; 
    } 
} 

यह निम्नलिखित फैशन में एक साथ श्रृंखला तरीकों करने की अनुमति देता:

String string = new StringBuildable() 
    .append("hello") 
    .append(' ') 
    .append.("World") 
    .toString() 
; 
+0

यह वास्तव में प्रश्न का उत्तर नहीं देता है। यह http://stackoverflow.com/questions/516291/the-use-of-this-in-java की ओर अधिक तैयार है। –

+0

प्रश्नों में से एक था: "क्या [यह] वैकल्पिक है या ऐसी स्थितियां हैं जब किसी को इसे अनिवार्य रूप से उपयोग करने की आवश्यकता होती है?"। मुझे विश्वास है कि मैंने एक उदाहरण दिखाया है जहां यह अनिवार्य है। यदि आप किसी विधि में ऑब्जेक्ट का उदाहरण वापस करना चाहते हैं तो आपको "यह" उपयोग करना होगा। – potyl

+0

मैं यह देखने में असफल रहा कि आपके उदाहरण में "यह" क्यों आवश्यक है। "This.internalAppend (पाठ)," "internalAppend (टेक्स्ट);" द्वारा प्रतिस्थापित किया जा सकता है। –

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