2016-04-11 9 views
5

मैं ऐसे प्रोजेक्ट पर काम कर रहा हूं जो पर्यवेक्षक पैटर्न का गहन रूप से उपयोग करता है। कई वर्गों को ईवेंट/संदेश श्रोताओं के रूप में उपयोग किया जाता है। आमतौर पर, सुन वर्ग निर्माता में खुद को पंजीकृत करता है, और मैं इस के साथ एक दो समस्याओं को देखने:श्रोताओं को पंजीकृत करने के लिए सही जगह कहां है

  1. हम निर्माता में काम कर रहे
  2. वर्ग मनाया वर्ग पर निर्भर हो जाता है, भले ही यह केवल रुचि है घटना में ही।

क्या पंजीकरण सुनना वर्ग की ज़िम्मेदारी होनी चाहिए या यह कुछ और जगह होनी चाहिए?

+1

मैं कहूंगा कि एक निर्माता काम कर सकता है लेकिन 2 इसे अलग करने का एक मजबूत कारण नहीं है। अगर श्रोताओं को केवल घटनाओं में दिलचस्पी है (और संभावित रूप से कई घटना स्रोतों पर पुन: उपयोग किया जा सकता है) तो उन्हें किसी और द्वारा पंजीकृत किया जाना चाहिए। आपके आवेदन पर कहां और कैसे निर्भर करेगा। – Thomas

उत्तर

3

एक निर्माता के भीतर से सदस्यता लेना विरासत के लिए मुद्दों का कारण बन सकता है।

public class Parent { 
    public Parent(EventObject source) { 
     // initialize parent ... 
     source.subscribe(this::someMethod); 
    } 
    public void someMethod() { 
     ... 
    } 
... 
} 

public class Child extends Parent { 
    public Child(EventObject source) { 
     super(source); 
     // initialize child ... 
    } 
... 
} 

Child ctor Parent ctor, जो अपने आप में घटना स्रोत के लिए पंजीकृत करता है कहता है: हम कोड जो इस तरह दिखता है कहो। ध्यान दें कि Child ऑब्जेक्ट प्रारंभ नहीं किया जाता है जब Parent पंजीकृत होता है। यदि Child ctor से पहले ईवेंट स्रोत अपडेट समाप्त हो गया है, तो आपका कोड बहुत अजीब व्यवहार कर सकता है।

इस मुद्दे से बचने का एक आसान तरीका है कारखाने के तरीकों के भीतर सब्सक्रिप्शन करना, सीटीआर को छुपा रखना।

public class Parent { 
    public static Parent newInstance(EventObject source) { 
     Parent p = new Parent(); 
     source.subscribe(p::someMethod); 
     return p; 
    }   
    protected Parent() { 
     // initialize parent ... 
    } 
    public void someMethod() { 
     ... 
    } 
... 
} 

public class Child extends Parent { 
    public static Child newInstance(EventObject source) { 
     Child c = new Child(); 
     source.subscribe(c::someMethod); 
     return c; 
    }  
    protected Child() { 
     super(); 
     // initialize child ... 
    } 
... 
} 
संबंधित मुद्दे

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