将枚举中的方法链接到客户端类的成员变量

时间:2009-09-09 03:21:47

标签: java design-patterns refactoring enums encapsulation

以下枚举结构执行某些操作,同时保持对客户端类的不可知性(出于封装原因)

    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()实现仅在Client类成员变量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),因此无法区分..

您是否建议我为每个varX和varY创建不同的自定义类型(以某种方式将它们包装?)?

我希望我对这个问题不太啰嗦。如果我不清楚,请告诉我。非常感谢。

1 个答案:

答案 0 :(得分:1)

根据Client的不同值,您希望MyEnum发生不同的事情。如果MyEnum必须与客户端无关,那么Client必须识别MyEnum的不同状态(Client.performMethod1中的切换)或单独的处理器类将具有实现那个逻辑。