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>
was ist ein Problem zu tun, wie Sie beschrieben, ich meine, Enum zu einem anderen Enum zu nisten? – maks
Definiert die YmanaCommand-Schnittstelle auch die toXml-Methode? – maks
Soweit ich weiß, sind verschachtelte Enums in Java nicht möglich, oder? –