0

次の列挙型構造は、クライアント クラスにとらわれずに特定の操作を実行します (カプセル化の理由により)。

    public enum MyEnum implements Commands{
    A{
        public int method1(int varY) {          
            return varY+2;
        }

        public MyEnum method2(){
                       return MyEnum.B;
              }

             //...other methods implementing Commands interface
    },
    B{

        public int method1(int varX) {
            return varX-2;
        }


               public MyEnum method2(){
                       return MyEnum.C;
              }

        //...other methods implementing Commands interface
    },
    C{

        public int method1(int varY) {
            return varY-2;
        }

        public MyEnum method2(){
                        return MyEnum.D;
               }


              //...other methods implementing Commands interface
    },
    D{

        public int method1(int varX) {
            return varX+2;
        }

        public MyEnum method2(){
                      return MyEnum.A;
                 }


             //...other methods implementing Commands interface
    }

クライアントクラス

    public class Client {
    private int varX;
    private int varY;
    private MyEnum enum;

    MyEnum getEnum(){
        return enum;
    }

    int varX(){
        return varX;
    }

    int getVarY(){
        return varY;
    }

    public Client(int varX, int varY, MyEnum enum){
        this.varX = varX;
        this.varY = varY;
        this.enum = enum;
    }

    public void performMethod1(MyEnum enum){        
        varX = getEnum().method1(getVarX()); //???
        varY = getEnum().method1(getVarY()); //???
    }

     public void performMethod2(...){
                enum = getEnum().method2();
      }
}

私の質問は、MyEnum.A と MyEnum.C に属する method1() の特定の実装をリンクして Client クラス メンバー varY で動作するようにする方法と、MyEnum.B と MyEnum.D の method1() 実装をリンクしてのみ動作させる方法です。クライアント クラス メンバー変数 varX。

たとえば、main() メソッド内では次のようになります。

Client aClient = new Client(aVarX, aVarY, anEnum);    
aClient.performMethod1(aClient.getEnum());

したがって、現在の列挙型の状態に応じて、上記のステートメントは varX または varY でのみ動作し、aClient の状態を変更する必要があります。

言いましょう:

aClient.performMethod1(MyEnum.A);

varYで表されるaClientの状態をvarY+2に変更する必要があります。varX は変更しないでください。

単純な命名規則からわかるように、現時点では MyEnum の varX は Client クラスの varX にリンクされていません。私の考えは、変数の型に傾いています。私はプリミティブ(int)を扱っているので、区別する方法はありません..

Client クラスで varX と varY のそれぞれに異なるカスタム タイプを作成することをお勧めしますか (何とかラップしますか?)。

質問が冗長すぎないことを願っています。よくわからない場合はお知らせください。どうもありがとう。

4

1 に答える 1

1

Clientのさまざまな値に応じて、 にさまざまなことが起こるようにしMyEnumます。MyEnumがクライアントに依存しない必要がある場合は、がClientのさまざまな状態MyEnum( のスイッチClient.performMethod1) を認識する必要があるか、別のプロセッサ クラスがそのロジックを実装する必要があります。

于 2009-09-09T05:31:19.827 に答える