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 回答