2011-05-26 19 views
6

के साथ कक्षाओं के लिए बराबर() विधि मैं अपने अनुप्रयोग में जावा कक्षाऔर Chapter के लिए equals विधि को लागू करने का प्रयास कर रहा हूं। Book का Chapter एस का एक सेट है, जबकि Chapter में Book संबंधित है। द्विदिश संघ के रूप में नीचे दिखाया गया है:बिडरेक्शनल एसोसिएशन

class Book{ 
    private String isbn; 
    private String name; 
    private Date publishDate; 
    private Set<Chapter> chapters; 
    ... 

    public boolean equals(Object o){ 
     if(o == this){ 
      return true; 
     } 
     if (!(o instanceof Book)){ 
      return false; 
     } 
     Book book = (Book)o; 
     if((this.isbn.equals(book.getIsbn())) && (this.name.equals(book.getName())) &&(this.publishDate.equals(book.getPublishDate())) &&(this.chapters.equals(book.getChapters()))){ 
      return true; 
     }else{ 
      return false; 
     } 

    } 
} 

अब मैं Chapter के लिए equals को लागू करने की कोशिश की:

public class Chapter { 
    private String title; 
    private Integer noOfPages; 
    private Book book; 
    ... 

    public boolean equals(Object o){ 
     if(o == this){ 
      return true; 
     } 
     if (!(o instanceof Chapter)){ 
      return false; 
     } 
     Chapter ch = (Chapter)o; 
     if((this.title.equals(book.getTitle())) && (this.noOfPages.intValue()== book.getNoOfPages().intValue()) ){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 

} 

यहाँ, मैं सोच रहा हूँ अगर मैं किताब क्षेत्र की तुलना करने के साथ-साथ की जरूरत है। क्या वह अनंत लूप शुरू नहीं करेगा? ऐसे बिडरेक्शनल एसोसिएशन के लिए equals विधि को लागू करने का सही तरीका क्या है?

उत्तर

1

(मुझे लगता है कि यह जावा है) अध्याय वर्ग में विधि के बराबर है, आप बस पुस्तक संदर्भों की तुलना कर सकते हैं (यानी, == का उपयोग करके, बराबर नहीं)। यह केवल संदर्भों की तुलना करता है, इसलिए यह एक अनंत लूप से बच जाएगा। हालांकि, अगर आप कभी-कभी किताबों को क्लोन करते हैं, तो यह दृष्टिकोण असफल हो जाएगा।

इस विशिष्ट मामले को हल करने का एक बेहतर तरीका किताबों की तुलना करना नहीं होगा, बल्कि उनके आईएसबीएन, क्योंकि यह पुस्तक के लिए एक अद्वितीय पहचानकर्ता है।

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

+1

यहां तक ​​कि अगर इंटरफेस का उपयोग कर वर्गों के बीच द्विदिश निर्भरता रोकता कर सकते हैं, वहाँ अभी भी कार्यावधि में उदाहरणों के बीच एक द्विदिश निर्भरता है। तो मेरा सुझाव है कि किसी को किताबों की तुलना नहीं करनी चाहिए (या तो '==' या 'बराबर()') से, लेकिन या तो किताबों को अनदेखा कर सकते हैं (अलग-अलग पुस्तकों के दो समान अध्याय वास्तव में बराबर या अलग हैं?), या किसी पुस्तक की तुलना करें आईएसबीएन की तरह पहचानकर्ता। –

+0

मैं पूरी तरह से सहमत हूं, मैंने बस परिपत्र निर्भरता पर टिप्पणी की क्योंकि मुझे जब भी संभव हो उससे बचने के लिए सिखाया गया था। –

1

मॉडलिंग परिप्रेक्ष्य से, अध्याय पुस्तक का हिस्सा है। तो यद्यपि आपके पास दोनों दिशाओं में संदर्भ हैं, लेकिन पुस्तक अध्याय की तुलना में "मजबूत" है।

जब आपके पास पुस्तक और अध्याय के साथ संबंधों का हिस्सा होता है, तो भाग (अध्याय) कभी-कभी समीकरण() को परिभाषित करते समय संपूर्ण (पुस्तक) खाते में ले जाता है। लेकिन दूसरे रास्ते में नहीं।

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

4

एक पुस्तक केवल एक अन्य पुस्तक के बराबर होनी चाहिए यदि उनके आईएसबीएन बराबर हैं। तो पुस्तक को केवल उस क्षेत्र के आधार पर लागू करें।

अध्याय के लिए - अध्याय संख्या और मालिक Book

1

तुम एक आईडी (आई) की तरह के रूप में एक Book क्षेत्र चुनने के लिए की तुलना करें। फिर, Chapter बराबर में, आप एक बात की तरह

book.getISBN().equals(other.book.getISBN()) 
संबंधित मुद्दे