वहाँ के लिए थोड़ा लाभ है जावा विधि पैरामीटर को अंतिम के रूप में सेट करना क्योंकि यह किसी को विधि के भीतर पैरामीटर संदर्भ के राज्य को बदलने से नहीं रोकता है। यह सब कुछ रोकता है पैरामीटर वैरिएबल का पुन: असाइनमेंट कुछ और है, जो मूल संदर्भ के लिए कुछ भी नहीं करता है, और यह अनाम आंतरिक कक्षाओं में पैरामीटर के उपयोग की अनुमति देता है। यदि आप इस स्थिति में सच्ची सुरक्षा चाहते हैं, तो आप संभवतः अपने पैरामीटर प्रकार अपरिवर्तनीय बनाने का प्रयास करेंगे।
संपादित
आप पोस्ट किया है:
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());
}
}
क्योंकि सी ++ में आप पैरामीटर को संदर्भ और पॉइंटर्स के रूप में भेज सकते हैं जो डेवलपर को मूल मान बदलने में सक्षम बनाता है, कभी-कभी गलती –
Apropos: http://stackoverflow.com/questions/4162531/making-java-method-arguments-as-final – jdv
क्योंकि जावा ** हमेशा ** मूल्य से गुजरता है, कॉल विधि के अंदर संदर्भ को संशोधित करना * अनिवार्य रूप से * ए है कोई को-अप। संदर्भ के माध्यम से राज्य को संशोधित करते समय सी ++ में व्यवहार किया जाएगा। –