2012-11-25 24 views
6

मैं एक एंड्रॉइड ऐप (जावा) पर काम कर रहा हूं जो HTTP पोस्ट के माध्यम से यामाहा ब्लू-रे प्लेयर के एपीआई का उपयोग करता है। एक्सएमएल प्रारूप में प्लेयर का सख्त कमांड सेट है। आदेश एक पदानुक्रम का पालन करते हैं: जबकि बाहरी एक्सएमएल तत्वों में से अधिकांश हमेशा समान होते हैं, अंदर की संरचना प्लेयर फ़ंक्शन के प्रकार से संबंधित होती है। उदाहरण के लिए, प्ले/पॉज़/स्टॉप फ़ंक्शंस में एक्सएमएल में एक ही पथ होता है, जबकि कार्यों को छोड़ने के अन्य माता-पिता तत्व होते हैं। आप निम्न कोड उदाहरण में मेरा क्या मतलब देख सकते हैं।जावा में नेस्टेड क्लास/ऑब्जेक्ट/एनम स्ट्रक्चर को परिभाषित करने का सबसे अच्छा तरीका क्या है?

public enum BD_A1010 implements YamahaCommand 
{ 
    POWER_ON ("<Main_Zone><Power_Control><Power>On</Power></Power_Control></Main_Zone>"), 
    POWER_OFF ("<Main_Zone><Power_Control><Power>Network Standby</Power></Power_Control></Main_Zone>"), 
    TRAY_OPEN ("<Main_Zone><Tray_Control><Tray>Open</Tray></Tray_Control></Main_Zone>"), 
    TRAY_CLOSE ("<Main_Zone><Tray_Control><Tray>Close</Tray></Tray_Control></Main_Zone>"), 
    PLAY ("<Main_Zone><Play_Control><Play>Play</Play></Play_Control></Main_Zone>"), 
    PAUSE ("<Main_Zone><Play_Control><Play>Pause</Play></Play_Control></Main_Zone>"), 
    STOP ("<Main_Zone><Play_Control><Play>Stop</Play></Play_Control></Main_Zone>"), 
    SKIP_REVERSE ("<Main_Zone><Play_Control><Skip>Rev</Skip></Play_Control></Main_Zone>"), 
    SKIP_FORWARD ("<Main_Zone><Play_Control><Skip>Fwd</Skip></Play_Control></Main_Zone>"); 

    private String command; 

    private BD_A1010 (String command) 
    { 
     this.command = command; 
    } 

    public String toXml() 
    { 
     return "<?xml version=\"1.0\" encoding=\"utf-8\"?><YAMAHA_AV cmd=\"PUT\">" + this.command + "</YAMAHA_AV>"; 
    } 
} 

जैसा कि आप देख सकते हैं, मैंने फ्लैट एनम मार्ग की कोशिश की, जो ठीक काम करता है। मैं ऐसे ही मेरी Remotecontrol वर्ग के साथ enums उपयोग कर सकते हैं:

remoteControl.execute(BD_A1010.PLAY); 

enum के .toXml() विधि खिलाड़ी को भेजने के लिए की जरूरत पूर्ण XML कोड देता है। अब मेरी समस्या है: मुझे जावा कक्षाओं में फ़ंक्शन पदानुक्रम बनाने के लिए एक बेहतर तरीका चाहिए। मैं इसे इस तरह उपयोग करना चाहता हूं:

remoteControl.execute(BD_A1010.Main_Zone.Power_Control.Power.On); 

नेस्टेड एनम्स या कक्षाओं की तरह। कमांड के प्रत्येक स्तर को अपने एक्सएमएल तत्व को अपने अंदर परिभाषित करना चाहिए। साथ ही, पथ पर प्रत्येक कमांड केवल उप-आदेशों को परिभाषित कर सकता है जो संभव है: उदाहरण के लिए, Main_Zone.Play_Control के बाद मैं केवल उपयोग कर सकता हूं। प्ले या .Skip, नहीं ..Tray या कुछ और। श्रृंखला के अंत में मैं पूर्ण XML कमांड प्राप्त करने के लिए .toXml() को कॉल करना चाहता हूं।

इस हाइराची को (नेस्टेड) ​​कक्षाओं के रूप में परिभाषित करने के लिए जावा में सबसे अच्छा तरीका क्या है? परिभाषित करना आसान होना चाहिए - जितना संभव हो उतना छोटा कोड।

बाद में, संयुक्त एक्सएमएल प्राप्त करने के लिए दो या दो से अधिक आदेशों को मर्ज करना संभव होना चाहिए - लेकिन यह पहली कोशिश के लिए इतना महत्वपूर्ण नहीं है।

remoteControl.execute(
    BD_A1010.Main_Zone.Power_Control.Power.On, 
    BD_A1010.Main_Zone.Play_Control.Skip.Rev, 
    BD_A1010.Main_Zone.Play_Control.Play.Pause 
); 

<Main_Zone> 
    <Power_Control> 
     <Power>On</Power> 
    </Power_Control> 
    <Play_Control> 
     <Skip>Rev</Skip> 
     <Play>Pause</Play> 
    </Play_Control> 
</Main_Zone> 
+0

जैसा कि आपने वर्णन किया है, क्या करने में कोई समस्या है, मेरा मतलब है कि किसी अन्य enum के लिए घोंसला है? – maks

+0

इसके अलावा, क्या YmanaCommand इंटरफ़ेस toXml विधि को परिभाषित करता है? – maks

+0

जहां तक ​​मुझे पता है, जावा में नेस्टेड enums संभव नहीं हैं, वे हैं? –

उत्तर

6

यह enum क्यों होना चाहिए? बचाव के लिए Builder pattern। इस स्वाद पर विचार करें: वेनिला के बजाय http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=2। मुख्य सुधार बहुत पठनीय वाक्यविन्यास है:

builder.withProperty(...).withFeature(...).finallyWith(...) 
+0

के रूप में माना जाएगा, मैं सहमत हूं, एक अच्छा उदाहरण है जिसे आप केरिवेस्की के "रिफैक्टरिंग टू पैटर्न" में ढूंढ सकते हैं - "बिल्डर के साथ कंपोजिट एन्सेप्लेट" (पृष्ठ 96 - 113) – s106mo

+0

@ s106mo –

+0

पुस्तक के लिंक के लिए धन्यवाद बुरा नहीं, मैं इसे मानता हूं। धन्यवाद! –