2013-02-18 49 views
8

आपको जावा में "यह" कीवर्ड लिखने की ज़रूरत नहीं है। लेकिन क्या ऐसा करना बेहतर है? क्या यह आपकी शैली को होमोजेनाइज़ करने के लिए समझ में आता है, यानी यदि आप एक बार "यह" उपयोग करते हैं, तो आप इसे हर बार इस्तेमाल करते हैं? या क्या कोई ऐसी जगह है जहां आप हमेशा इसका इस्तेमाल करेंगे और अन्य जहां आप इसका कभी भी उपयोग नहीं करेंगे?जावा: अधिक पढ़ने योग्य, "यह" या नहीं "यह"

+3

यह ऐसा कुछ है जो हमेशा मुझे परेशान करता है। एक सामान्य नियम के रूप में आप जितना कर सकते हैं उससे बचा जाता है, लेकिन फिर बहुत से लोग नाम के साथ उदाहरण गुण/सदस्यों को कॉल करते हैं जो 'एम' से शुरू होते हैं ताकि आपको याद दिलाया जा सके कि यह एक उदाहरण सदस्य है ... क्यों न केवल' m' और 'this.theMemberName' करें? – Bakuriu

+0

@ बाकुरीयू हंगेरियन को दोषी ठहराते हैं! http://en.wikipedia.org/wiki/Hglish_notation मेरा मानना ​​है कि यह पूरे "हैकर आलसी हैं" प्रारूप जो इतिहास के माध्यम से चलता है। चूंकि m_theMemberName इस से छोटा है। वह सदस्य नाम, वे पूर्व को पसंद करते हैं। – Soyuz

+0

मैं उन तरीकों में 'this' का उपयोग करना चाहता हूं जो पैरामीटर के समान वर्ग के ऑब्जेक्ट्स लेते हैं, उदाहरण के लिए 'बराबर()' और 'तुलना करने के लिए()' –

उत्तर

18

आम सहमति यह है कि आपको केवल this का उपयोग करना चाहिए जब आवश्यक हो और किसी भी समय नहीं।

private String param; 
public Construct(String param) { 
    // Usually the only place you need to use this. 
    this.param = param; 
} 

// A less common use of this 
public Function() { 
    synchronized(this) { 
    // Some synchronized stuff. 
    } 
} 
2

, कोड है, जहां आप this कीवर्ड को छोड़ नहीं कर सकता है में कुछ स्थानों रहे हैं जैसे setters:

public void setValue(String value) { 
    this.value = value; 
} 

लेकिन इसके यदि संभव हो तो इसे छोड़ बेहतर है:

public String getValue() { 
    return value; 
} 
+0

ठीक है, वास्तव में आप पैरामीटर के लिए एक अन्य नाम का उपयोग कर सकते हैं क्योंकि जावा में कीवर्ड तर्क नहीं हैं और इस प्रकार यह एपीआई नहीं बदलेगा। – Bakuriu

3

एक सामान्य नियम के आप अनावश्यक वाक्य रचना से बचना चाहिए जहाँ भी यह पैदा हो सकता है के रूप में। आप इसके विपरीत बहुत सारी राय पढ़ेंगे, ज्यादातर एक पूरी तरह से पौराणिक प्रोग्रामर का जिक्र करते हैं जो सदस्य चर के बारे में नहीं जानता है, यह नहीं जानता कि किनारे के लिए हैं, और ऑपरेटर प्राथमिकता के नियमों को याद नहीं है जिन्हें उन्हें तीसरे में पढ़ाया गया था ग्रेड। मैंने कभी 40 वर्षों में उससे मुलाकात नहीं की है। यह धारणा पर उनके लिए अपने कोड को डिफिगर करने के लिए पर्याप्त नहीं है कि वह (ए) इसे समझ नहीं पाएगा और (बी) इसलिए इसे तोड़ दें। मैंने कभी ऐसा नहीं देखा है।

क्या मैं देखा है ऐसे व्यक्ति द्वारा उत्पादित कोड है। उसके लिए अपने कोड को कम करने का कोई कारण नहीं है। जिन अवसरों पर कोई वास्तव में मेरे कोड के टुकड़े को गलत तरीके से लिखने के लिए चला गया है, वे वास्तव में दो हैं: एक बार 1 9 7 9 में, जहां किसी ने ऑपरेटर की प्राथमिकता को हटाने के लिए व्याकरण को दोहराया, जो गूंगा था, और उसे नहीं करना चाहिए था यह, और 1 99 2 में एक और बार, लेकिन दोनों मामलों में ऐसा कोई तरीका नहीं है कि मैं व्याकरण या कोड लिख सकता था जो इसे रोकता।

-1

विधि कॉल के संदर्भ में this मामलों का केवल समय उपयोग यदि आप OuterClass.this.method() का उपयोग कर रहे हैं।

class OuterClass { 
    void method() { } 

    class InnerClass { 
     void method() { 
      OuterClass.this.method(); // not the same as method(). 
     } 
    } 
} 
+1

यह एकमात्र समय नहीं है। ऐसे मामले भी हैं जहां एक ही नाम के साथ एक तर्क या स्थानीय चर है। – EJP

+0

@EJP मैं विधि कॉल के संदर्भ में बात कर रहा हूं। –

+0

किसी विधि कॉल में संदर्भ को प्रतिबंधित करने के बारे में प्रश्न में कुछ भी नहीं है। उपयोगी नहीं। – EJP

6

एक नियम के रूप में मैं इसका उपयोग नहीं करता - अगर आप अनावश्यक कोड को कम कर सकते हैं तो बेहतर होगा।

हालांकि तीन स्थानों है कि मैं जहां इस कीवर्ड से परहेज किया जाना नहीं कर सकते के बारे में सोच सकते हैं:

  • कंस्ट्रक्टर्स (एक ही कक्षा में एक और निर्माता को सौंपने)

    public MyClass() { 
        this("Default Parameter"); 
    
  • पर सिंक्रनाइज़ किया जा रहा वर्तमान ऑब्जेक्ट

    synchronized(this) {

  • अन्य वर्ग

    public void methodOne() { 
        anotherClass.doSomething(this); 
    

आप कभी-कभी कंस्ट्रक्टर्स जहां फ़ील्ड नाम पैरामीटर के रूप में एक ही है में इसकी आवश्यकता वर्तमान वस्तु पासिंग, लेकिन यह नहीं है वास्तव में अनिवार्य आप बस पैरामीटर नाम बदलने सकता है:

public MyClass(String data) { 
    this.data = data 

इन मैं नहीं कर सकते, जहां मैं this कीवर्ड का उपयोग करेंगे भी कई अन्य परिदृश्यों के बारे में सोच के अलावा। मैंने इसे अधिक उपयोग किया है (प्रत्येक विधि और क्षेत्र संदर्भ पर) और यह कोड को पढ़ने के लिए बहुत कठिन बना सकता है।

केवल तभी उपयोग करें जब आपको करना होगा, या जब आपको लगता है कि यह कोड पठनीयता को बढ़ाता है।

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

  • कोई संबंधित समस्या नहीं^_^