2012-11-25 10 views
6

Ich arbeite an einer Android App (Java), die die API eines Yamaha Blu-ray Players über HTTP POST verwendet. Der Player verfügt über einen strikten Befehlssatz im XML-Format. Befehle folgen einer Hierarchie: Während die meisten der äußeren XML-Elemente immer gleich sind, gehört die Struktur innerhalb des Typs zum Player-Typ. Zum Beispiel haben die Play/Pause/Stop-Funktionen den gleichen Pfad in XML, während Skip-Funktionen andere Elternelemente haben. Sie können sehen, was ich im folgenden Codebeispiel meine.Was ist der beste Weg, um eine verschachtelte Klasse/Objekt/Enum-Struktur in Java zu definieren?

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>"; 
    } 
} 

Wie Sie sehen können, habe ich versucht die flache Enum Weg, die gut funktioniert. Ich kann die Aufzählungen mit meiner Remote Control-Klasse verwenden, einfach so:

remoteControl.execute(BD_A1010.PLAY); 

ENUM ist .toXml() -Methode gibt den vollständigen XML-Code benötigt, um den Spieler zu senden. Jetzt ist hier mein Problem: Ich brauche eine bessere Möglichkeit, die Funktionshierarchie in Java-Klassen zu erstellen. Ich möchte es so verwenden:

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

Wie verschachtelte Enums oder Klassen. Jede Ebene des Befehls sollte sein XML-Element in sich selbst definieren. Außerdem kann jeder Befehl auf einem Pfad nur die Unterbefehle definieren, die möglich sind: zum Beispiel kann ich nach Main_Zone.Play_Control nur .Play oder .Skip, nicht .Tray oder irgendetwas anderes verwenden. Am Ende der Kette möchte ich .toXml() aufrufen, um den vollständigen XML-Befehl zu erhalten.

Was ist der beste Weg in Java, diesen Hiarachy als (verschachtelte) Klassen zu definieren? Sollte einfach zu definieren sein - so wenig Code wie möglich.

Später sollte es möglich sein, zwei oder mehr Befehle zusammenzuführen, um eine kombinierte XML wie die folgende zu erhalten - aber das ist nicht so wichtig für den ersten Versuch.

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

was ist ein Problem zu tun, wie Sie beschrieben, ich meine, Enum zu einem anderen Enum zu nisten? – maks

+0

Definiert die YmanaCommand-Schnittstelle auch die toXml-Methode? – maks

+0

Soweit ich weiß, sind verschachtelte Enums in Java nicht möglich, oder? –

Antwort

6

Warum muss es enum sein? Builder pattern zur Rettung. Betrachten Sie diesen Geschmack: http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=2 anstelle von Vanille. Die Kernverbesserung ist eine sehr gut lesbare Syntax:

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

Dem stimme ich zu, ein gutes Beispiel finden Sie in Kerievskys "Refactoring to Patterns" - "Encapsulate Composite with Builder" (S. 96 - 113)) – s106mo

+0

@ s106mo danke für den Link zum Buch –

+0

Nicht schlecht, ich werde es mir überlegen. Vielen Dank! –

Verwandte Themen