2015-06-28 7 views
6

मैं हमेशा जावा में प्रोग्रामिंग कर रहा हूं, और हाल ही में मैंने कुछ सी ++ सीखना शुरू कर दिया है।जावा में सेटर पैरा अंतिम

सी ++ में सेटर पैरा को कॉन्स्ट के रूप में सेट करने के लिए परंपरागत है, हम इसे जावा में इतना क्यों नहीं देखते हैं?

मेरा मतलब है वहाँ बहुत की तरह एक सेटर बनाने के लिए किसी भी नुकसान कर रहे हैं: पहले एक पूरे सेट समारोह के माध्यम से निरंतर रहने के लिए वस्तु परम ओ के लिए लागू करना चाहिए

public void setObject(final Object o){ this.o=o; } 

बनाम

public void setObject(Object o){ this.o=o; } 

, नहीं ?

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

एक अंतिम परम इस लागू होता नहीं होने के लिए:

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

उपयोगकर्ता कभी नहीं नाम "कार्लोस" से अलग सेट करने के लिए सक्षम हो जाएगा

+2

क्योंकि सी ++ में आप पैरामीटर को संदर्भ और पॉइंटर्स के रूप में भेज सकते हैं जो डेवलपर को मूल मान बदलने में सक्षम बनाता है, कभी-कभी गलती –

+1

Apropos: http://stackoverflow.com/questions/4162531/making-java-method-arguments-as-final – jdv

+0

क्योंकि जावा ** हमेशा ** मूल्य से गुजरता है, कॉल विधि के अंदर संदर्भ को संशोधित करना * अनिवार्य रूप से * ए है कोई को-अप। संदर्भ के माध्यम से राज्य को संशोधित करते समय सी ++ में व्यवहार किया जाएगा। –

उत्तर

4

ठीक है, एक final पैरामीटर/चर को सौंपा नहीं जा सकता है। चूंकि जावा कंपाइलर को यह निर्धारित करने में सक्षम होना चाहिए कि कोई चर/पैरामीटर वास्तव में फ़ाइनल (अनाम आंतरिक कक्षाओं के लिए) है, अनुकूलन कोई कारक AFAIK नहीं है।

यह और भी है कि सी ++ में एक बड़ा टूल सेट है, जिसे जावा ने कम करने की कोशिश की। इसलिए सी का उपयोग कर ++ const string& महत्वपूर्ण है,

  1. स्ट्रिंग सूचक द्वारा पारित कर दिया है और कहा, पहुँच स्वचालित रूप से dereferenced है।
  2. यदि वास्तविक तर्क एक चर है, तो परिवर्तनीय स्वयं परिवर्तित नहीं होता है।
  3. माइंड const string& से कुछ और पास करने के लिए एक रूपांतरण ऑपरेटर हो सकता है।

अब जावा:

  1. जावा ढेर पर वस्तुओं का आवंटन नहीं करता है, केवल आदिम प्रकार रखता है और वस्तु स्टैक पर संभालती है।
  2. जावा में आउटपुट पैरामीटर नहीं हैं: एक विधि कॉल में पारित एक चर इसके तत्काल मूल्य को कभी नहीं बदलेगा।

अपने प्रश्न पर वापस

जावा में एक सेटर के रूप में ज्यादातर एक अंतिम पैरामीटर से लाभ नहीं होता। एक अंतिम अनुबंध एक दूसरे असाइनमेंट के लिए चर का उपयोग नहीं करने के लिए एक अनुबंध होगा।

हालांकि

:

public final void setXyz(Xz xyz) { 
    this.xyz = xyz; 
} 

अधिक उपयोगी है: इस विधि ओवरराइड नहीं किया जा सकता है, और इसलिए सुरक्षित रूप से एक निर्माता में इस्तेमाल किया जा सकता है। (एक कन्स्ट्रक्टर में एक ओवर्रिडेन विधि को कॉल करना अभी भी प्रारंभिक बाल उदाहरण के संदर्भ में नहीं होगा।)

+0

अच्छा विषय पर ले लो, धन्यवाद! 1 + –

6

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


संपादित
आप पोस्ट किया है:

public void setObject(Object o){ 
    o++; // this does not compile 
    this.o=o; 
} 

कौन सा आदिम सांख्यिक और संदर्भ प्रकार घुलमिल। यह केवल समझ में आता है, तो ओ एक पूर्णांक या अन्य संख्यात्मक आवरण वर्ग है, और फिर भी, यह अंतिम बनाने से किसी को रोकने नहीं होगा बनाने:

private void setI(final Integer i) { 
    this.i = 1 + i; 
} 

लेकिन न तो अपने कोड और न ही इस कोड को ऊपर पर पैरामीटर वस्तु को प्रभावित करती है कॉलिंग कोड पक्ष।


संपादित
ठीक अब आप पोस्ट किया है:

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

लेकिन तब कोई

public void setName(final String name){ 
    this.name= name + " Carlos"; 
} 

लिख सकता है यहाँ जहां खतरा आता है और जहां अंतिम मदद नहीं करता है । मान लें कि आपके पास नाम:

public class Name { 
    private String lastName; 
    private String firstName; 
    public Name(String lastName, String firstName) { 
     this.lastName = lastName; 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
} 

और फिर नाम फ़ील्ड और एक सेटर के साथ एक वर्ग, Foo है।यह वह जगह है खतरनाक कोड:

class Foo { 
    private Name name; 

    public void setName(final Name name) { 
     name.setFirstName("Carlos"); 
     this.name = name; 
    } 
} 

क्योंकि न केवल यह क्षेत्र की स्थिति बदलने करता है, यह बुला कोड में नाम संदर्भ के राज्य बदलता है, और अंतिम संशोधक एक में मदद नहीं करेगा बिट। समाधान: नाम अपरिवर्तनीय बनाओ।

जैसे

import java.util.Date; 

// class should be declared final 
public final class BetterName { 
    private String lastName; 
    private String firstName; 
    private Date dateOfBirth; 

    public BetterName(String lastName, String firstName, Date dob) { 
     this.lastName = lastName; 
     this.firstName = firstName; 

     // make and store a private copy of non-immutable reference types 
     dateOfBirth = new Date(dob.getTime()); 
    } 

    // only getters -- no setters 
    public String getLastName() { 
     return lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public Date getDateOfBirth() { 
     // return copies of non-immutable fields 
     return new Date(dateOfBirth.getTime()); 
    } 
} 
+0

हां, लेकिन इसका मतलब यह होगा कि आपके पैरा को सही में सेटर्स के रूप में सेट करना बुद्धिमान होगा (इसलिए आप प्रारंभिक दिए गए मान को नहीं खोते हैं)? तो हम इसे एक सम्मेलन के रूप में क्यों नहीं देखते हैं? –

+0

@KoenDemonie: मैं उपरोक्त आपके कथन को समझ नहीं पा रहा हूं।एक सेटटर पैरामीटर फ़ाइनल बनाने के लिए व्यावहारिक रूप से कोई फायदा नहीं है। आपका मतलब क्या है '' 'तो आप प्रारंभिक दिए गए मान को नहीं खोते हैं "'? फिर, सबसे महत्वपूर्ण घर बिंदु यह है कि जब भी और जहां भी संभव हो, अपने वर्गों को अपरिवर्तनीय बनाने की कोशिश करें। –

+0

ठीक है, अगर यह अंतिम नहीं है तो सेटर फ़ंक्शन अपना मान बदल सकता है, और प्रारंभिक दिया गया मान खो सकता है ... कुछ भी बड़ा नहीं है लेकिन अंतिम जोड़ना चोट नहीं पहुंचाता है और इस समस्या को ठीक कर सकता है –

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