6

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>
4

1 に答える 1

6

なぜ列挙型でなければならないのですか?救助へのビルダーパターン。このフレーバーを検討してください: http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=2バニラの代わりに。コアの改善点は、非常に読みやすい構文です。

builder.withProperty(...).withFeature(...).finallyWith(...)
于 2012-11-25T20:56:42.473 に答える