HTTP POST 経由で Yamaha Blu-ray Player の API を使用する Android アプリ (Java) に取り組んでいます。プレーヤーには、XML 形式で設定された厳密なコマンドがあります。コマンドは階層に従います。外側の XML 要素のほとんどは常に同じですが、内部の構造はプレーヤー関数のタイプに属します。たとえば、再生/一時停止/停止関数には XML で同じパスがあり、スキップ関数には別の親要素があります。次のコード例で、私が意味することを確認できます。
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 クラスで列挙型を使用できます。
remoteControl.execute(BD_A1010.PLAY);
列挙型の .toXml() メソッドは、プレーヤーに送信するために必要な完全な XML コードを返します。ここで私の問題があります。Java クラスで関数階層を構築するためのより良い方法が必要です。私はそれを次のように使いたい:
remoteControl.execute(BD_A1010.Main_Zone.Power_Control.Power.On);
ネストされた列挙型またはクラスのように。コマンドの各レベルでは、その XML 要素を内部で定義する必要があります。また、パス上の各コマンドは、可能なサブコマンドのみを定義する場合があります。たとえば、Main_Zone.Play_Control の後では、.Tray などではなく、.Play または .Skip のみを使用できます。チェーンの最後で .toXml() を呼び出して、完全な XML コマンドを取得します。
この階層を(ネストされた)クラスとして定義するJavaでの最良の方法は何ですか? 簡単に定義できる必要があります-コードはできるだけ少なくしてください。
後で、2 つ以上のコマンドをマージして、次のような結合された XML を取得できるようにする必要がありますが、最初の試行ではそれほど重要ではありません。
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>