2015-11-30 7 views
5

मैं प्रभावी जावा, आइटम 8 का अध्ययन कर रहा हूं (बराबर ओवरराइड करते समय सामान्य अनुबंध का पालन करें)। यह लेखक द्वारा स्पष्ट रूप से समझाया गया है, लेकिन अभी भी कुछ हिस्सों को इतना विस्तृत नहीं किया गया है।फ़ील्ड का कैनोनिक रूप

इस उदाहरण के लिए, वह एक वर्ग CaseInsensitiveString के रूप में परिभाषित मानता है:

public final class CaseInsensitiveString { 
    private final String s; 

    public CaseInsensitiveString(String s) { 
     if (s == null) 
      throw new NullPointerException(); 
     this.s = s; 
    } 

    // Broken - violates symmetry! 
    @Override 
    public boolean equals(Object o) { 
     if (o instanceof CaseInsensitiveString) 
      return s.equalsIgnoreCase(((CaseInsensitiveString) o).s); 
     if (o instanceof String) // One-way interoperability! 
      return s.equalsIgnoreCase((String) o); 
     return false; 
    } 
    // ... // Remainder omitted 
} 

लेख के अंत में, वे कहते हैं:

ऐसे CaseInsensitiveString ऊपर, क्षेत्र की तुलना के रूप में कुछ वर्गों के लिए, सरल समानता परीक्षणों की तुलना में अधिक जटिल हैं। यदि ऐसा है, तो आप क्षेत्र के एक कैनोलिक रूप को संग्रहीत करने के लिए चाह सकते हैं, इसलिए बराबर विधिइन महंगे रूपों पर तुलनात्मक रूप से अधिक महंगे असमान तुलना-तुलना में तुलना कर सकती है- आइसन। यह तकनीक अपरिवर्तनीय कक्षाओं (आइटम 15) के लिए सबसे उपयुक्त है; यदि ऑब्जेक्ट बदल सकता है, तो आपको कैननिकल फॉर्म को अद्यतित रखना होगा।

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

उत्तर

5

मुझे लगता है कि इस विशेष उदाहरण में, एक कैनोलिक रूप स्ट्रिंग के लोअरकेस या अपरकेस संस्करण को संग्रहीत कर सकता है और उस पर तुलना कर सकता है।

private final String s; 

public CaseInsensitiveString(String s) { 
    //for real code probably use locale version 
    this.s = s.toLowerCase(); 
} 

इसका कारण यह है कि हम के बजाय और अधिक महंगा equalsIgnoreCase

// Broken - violates symmetry! 
@Override 
public boolean equals(Object o) { 
    if (o instanceof CaseInsensitiveString) 
     return s.equals(((CaseInsensitiveString) o).s); 
    if (o instanceof String) // One-way interoperability! 
     return s.equals((String) o); 
    return false; 
} 
+0

धन्यवाद, काफी आसान सटीक स्ट्रिंग तुलना कर सकते हैं समानता तुलना में सस्ता पड़ता है। यह पता लगाना चाहिए था। स्वीकार किए जाते हैं! –

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