गेटर्स और सेटर कैसे काम करते हैं?


107

मैं php दुनिया से हूँ। क्या आप समझा सकते हैं कि गेटर्स और सेटर क्या हैं और आपको कुछ उदाहरण दे सकते हैं?


@ yegor256 मैं आपके कुत्ते और गेंद की समानता को समझता हूं और मैं इसका समर्थन भी करता हूं, लेकिन जब एक "जीवित जीव" वस्तु कभी-कभी आदिम मूल्य जैसे आईडी को स्टोर करती है? क्या होगा यदि आप साधारण असाइनमेंट से परे एक कदम आगे बढ़ना चाहते हैं लेकिन केवल आदिम मूल्यों को संभालने के लिए एक नया वर्ग लिखना नहीं चाहते हैं?
जैक्सनक्रे

जवाबों:


127

इसके लिए ट्यूटोरियल की आवश्यकता नहीं है। एनकैप्सुलेशन पर पढ़ें

private String myField; //"private" means access to this is restricted

public String getMyField()
{
     //include validation, logic, logging or whatever you like here
    return this.myField;
}
public void setMyField(String value)
{
     //include more logic
     this.myField = value;
}

11
इसलिए गेट्टर सिर्फ एक तरीका है जो निजी क्षेत्र को प्राप्त कर रहा है और सेटर एक नया क्षेत्र सेट कर रहा है। कोड द्वारा उत्कृष्ट स्पष्टीकरण के लिए धन्यवाद
ajsie

1
क्या आप एक गेटर को एक पैरामीटर दे सकते हैं?
अजेसी

2
नाम: नहीं और नहीं। गेट्टर एक मान प्राप्त करने का एक तरीका है, लेकिन एक क्षेत्र में निहित मूल्य को उजागर नहीं करता है, अगर आप कहते हैं someObj.getTime().setHour(5)कि यह someObjआंतरिक स्थिति को प्रभावित नहीं करना चाहिए । इसके अलावा बसने वाले और पाने वाले (अपने कट्टर नाम से एक्सेसर्स और म्यूटेटर) एक बहुत ही सख्त विधि हस्ताक्षर का अर्थ है कि गेट्टर का कोई पैरामीटर नहीं है। सामान्य तौर पर तरीके केवल एक ही काम करना चाहिए।
एस्को

4
@noname: जब साधारण चीजों को जटिल / बड़ा / सार नाम दिया जाता है, तो आपके पास "डिज़ाइन पैटर्न" कहा जाता है .... और यह रिसर्सेक्टिव कॉन्सेप्ट स्पष्टीकरण पैटर्न का एक उदाहरण है जिसका मैंने अभी आविष्कार किया; ;-)
namepaceform

3
@qed: thisकीवर्ड वैकल्पिक है जब तक कि किसी ऐसी चीज के साथ संघर्ष न हो जिसमें अधिक विशिष्ट गुंजाइश हो। आपके द्वारा दिए गए उदाहरण में, जो सेटर बनाया गया है, उसमें एक एकल पैरामीटर होगा जिसका नाम फ़ील्ड नाम से मेल खाता है, इसलिए this.fieldName = fieldName, यह अंतर करने के लिए उपयोग किया जाता है कि फ़ील्ड को असाइन किया जा रहा है पैरामीटर के बजाय इसके स्व को सौंपा जा रहा है fieldName = fieldname। गटर में ऐसा कोई संघर्ष मौजूद नहीं है।
पॉल क्रीज

39

जावा में गेटर्स और सेटर पूरी तरह से साधारण कार्य हैं। केवल एक चीज जो उन्हें गेटर्स या सेटर बनाती है वह है कन्वेंशन। Foo के लिए एक गेटटर को getFoo कहा जाता है और सेटर को setFoo कहा जाता है। एक बूलियन के मामले में, गेट्टर को फुफू कहा जाता है। उनके पास एक विशिष्ट घोषणा भी होनी चाहिए जैसा कि 'नाम' के लिए एक गेट्टर और सेटर के इस उदाहरण में दिखाया गया है:

class Dummy
{
    private String name;

    public Dummy() {}

    public Dummy(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

अपने सदस्यों को सार्वजनिक करने के बजाय गेटर्स और सेटर का उपयोग करने का कारण यह है कि यह इंटरफ़ेस को बदले बिना कार्यान्वयन को बदलना संभव बनाता है। इसके अलावा, कई उपकरण और टूलकिट जो वस्तुओं का परीक्षण करने के लिए प्रतिबिंब का उपयोग करते हैं, केवल उन वस्तुओं को स्वीकार करते हैं जिनमें गेटर्स और सेटर हैं। उदाहरण के लिए जावाबीन में गेटर्स और सेटर और कुछ अन्य आवश्यकताएं होनी चाहिए।


9
क्या उन कंस्ट्रक्टर्स के पास 'शून्य' नहीं होना चाहिए?
जेसन हार्टले

यहां वास्तव में शून्य आवश्यक है। यदि आपके पास यह नहीं है, तो आप:error: invalid method declaration; return type required
Dan

3
यहां शून्य की आवश्यकता नहीं है
शशि किरण

2
@ जैसनहार्टली: एक कंस्ट्रक्टर के पास रिटर्न टाइप नहीं होता है।
wassimans

@ मर्क बायर्स तो, कंस्ट्रक्टर का उपयोग इंस्टेंस को इनिशियलाइज़ करने के लिए किया जाता है, और किसी भी विशेषता को बदलने के लिए सेटर का उपयोग किया जाता है। क्या ये सही है?
carloswm85

12
class Clock {  
        String time;  

        void setTime (String t) {  
           time = t;  
        }  

        String getTime() {  
           return time;  
        }  
}  


class ClockTestDrive {  
   public static void main (String [] args) {  
   Clock c = new Clock;  

   c.setTime("12345")  
   String tod = c.getTime();  
   System.out.println(time: " + tod);  
 }
}  

जब आप प्रोग्राम चलाते हैं, तो प्रोग्राम मेन में शुरू होता है,

  1. ऑब्जेक्ट सी बनाया गया है
  2. समारोह setTime() को ऑब्जेक्ट c से पुकारा जाता है
  3. परिवर्तनशील time को पास से मान पर सेट किया गया है
  4. समारोह getTime() को ऑब्जेक्ट c से पुकारा जाता है
  5. समय वापस आ गया है
  6. यह पज़ेस करेगा todऔर todप्रिंट आउट प्राप्त करेगा

10

आप यह भी पढ़ सकते हैं कि " क्यों गटर और सेटर विधियां बुराई हैं ":

यद्यपि जावा में गेटटर / सेटर विधियां आम हैं, वे विशेष रूप से ऑब्जेक्ट ओरिएंटेड (OO) नहीं हैं। वास्तव में, वे आपके कोड की स्थिरता को नुकसान पहुंचा सकते हैं। इसके अलावा, कई गेट्टर और सेटर विधियों की उपस्थिति एक लाल झंडा है जो कि प्रोग्राम को एक ओओ के नजरिए से अच्छी तरह से डिज़ाइन नहीं किया गया है।

यह आलेख बताता है कि आपको गेटर्स और सेटर्स का उपयोग क्यों नहीं करना चाहिए (और जब आप उनका उपयोग कर सकते हैं) और एक डिज़ाइन कार्यप्रणाली का सुझाव देता है जो आपको गेटटर / सेटर मानसिकता से बाहर निकलने में मदद करेगा।


3

1. सबसे अच्छा गेटर्स / सेटर्स स्मार्ट हैं।

यहाँ मोज़िला से एक जावास्क्रिप्ट उदाहरण दिया गया है:

var o = { a:0 } // `o` is now a basic object

Object.defineProperty(o, "b", { 
    get: function () { 
        return this.a + 1; 
    } 
});

console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)

मैंने इन A LOT का उपयोग किया है क्योंकि वे कमाल के हैं । अपने कोडिंग + एनीमेशन के साथ फैंसी मिलने पर मैं इसका उपयोग करूंगा। उदाहरण के लिए, एक ऐसा सेटर बनाएं Numberजो आपके वेबपेज पर उस नंबर को प्रदर्शित करता है। जब सेटर का उपयोग किया जाता है तो यह पुराने नंबर को ट्वीटर का उपयोग करके नए नंबर पर ले जाता है । यदि प्रारंभिक संख्या 0 है और आप इसे 10 पर सेट करते हैं, तो आप संख्याओं को 0 से 10 ओवर तक जल्दी से फ्लिप करते दिखेंगे, मान लीजिए, आधा सेकंड। उपयोगकर्ता इस सामान को पसंद करते हैं और इसे बनाने में मज़ा आता है।

2. php में गेटर्स / सेटर

सोफ से उदाहरण

<?php
class MyClass {
  private $firstField;
  private $secondField;

  public function __get($property) {
    if (property_exists($this, $property)) {
      return $this->$property;
    }
  }

  public function __set($property, $value) {
    if (property_exists($this, $property)) {
      $this->$property = $value;
    }

    return $this;
  }
}
?>

citings:


2

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

package stackoverflow;

    public class StackoverFlow 

    {

        private int x;

        public int getX()
        {
            return x;
        }

        public int setX(int x)
        {
          return  this.x = x;
        }
         public void showX()
         {
             System.out.println("value of x  "+x);
         }


        public static void main(String[] args) {

            StackoverFlow sto = new StackoverFlow();
            sto.setX(10);
            sto.getX();
            sto.showX();
        }

    }

मैं आपको नीचा दिखाने वाला नहीं हूं (प्रयास के लायक नहीं)। कृपया ध्यान रखें कि (1) आपने जावा प्रश्न पर उत्तर दिया है, जहां प्रोग्राम भाषा जावा में होनी चाहिए । (2) यदि आप पोस्ट करना चाहते हैं, तो सुनिश्चित करें कि लेआउट सही ढंग से किया गया है। (3) एनकैप्सुलेशन (गेट्टर (या एक्सेसर) और सेटर्स (या म्यूटेटर) का आपका उपयोग गलत है। कृपया ऊपर देखो कैप्सूलीकरण साधन क्या ... (चेक जवाब मतदान)
KarelG

1
@ कर्लजी माफ करना, मैंने टैग नहीं पढ़ा। मैंने इसे जावा में अपडेट किया। मुझे साकार करने के लिए धन्यवाद।
बशीर अहमद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.