2009-09-09 45 views
0

同时保持不可知的客户端类(用于封装的原因)从Enum客户端类的成员变量联方法

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()的特定实现,以便它们在客户端类成员varY上运行,并且MyEnum.B和MyEnum.D的method1()实现仅在客户端类成员变量varX。

例如一个main()方法中:

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

因此,根据在当前枚举状态,上面的语句只应在VARx前提操作或改变并且更改aClient的状态。

我们先来说说:

aClient.performMethod1(MyEnum.A); 

aClient代表的状态变化应改为变化+ 2。 varX应该保持不变。

正如您通过简单的命名约定所看到的,此时MyEnum中的varX没有以任何方式链接到Client类中的varX。我的想法倾向于变量的类型。由于我正在使用基元(int),因此无法区分。

您会推荐我在客户端类中为每个varX和varY创建不同的自定义类型吗?

我希望我对问题不要太冗长。如果我不清楚,请告诉我。非常感谢。

+0

在“performMethod1(...)”中,您使用“getEnum()。method1(...)”,因此它的方法1的客户端的枚举不是“enum”参数。 我不确定是否要使用参数“枚举”做method1或什么?请进一步澄清。 – NawaMan 2009-09-09 03:32:59

+0

是的,客户端只是委托MyEnum类中的不同枚举来执行方法逻辑。 但是由于MyEnum也是客户端的成员变量,所以为了改变客户端的状态,我需要将MyEnum传递给其他方法,如method2()。这是否更清楚?感谢您的评论 – denchr 2009-09-09 11:10:39

+0

我更新了MyEnum和客户端代码,以显示客户端委托给MyEnum并保存该客户端属性的枚举状态并更改其状态。 - 目标是对varX,varY客户端成员做同样的事情 – denchr 2009-09-09 11:25:27

回答

1

根据MyEnum的不同值,您希望Client发生不同的事情。如果MyEnum必须是客户端不可知的,那么Client将不得不识别MyEnumClient.performMethod1中的开关)的不同状态,或者单独的处理器类将具有实现该逻辑。

+0

报表,但目的是为了避免客户端中的switch/if语句。例如,在MyEnum中未显示的另一种方法中,假设方法2,我可以在MyEnum案例本身上进行操作。然后,在客户端中,我可以将其封装在performMethod2(MyEnum枚举)中,并更改客户端的枚举状态 – denchr 2009-09-09 11:07:47

+0

我编辑了我的原始帖子以在MyEnum中包含method2()。现在更好地表明,Client有能力通过performMethod2()简单地委托给MyEnum,保持其状态和行为封装,而MyEnum基本上是Client不可知的 - 不引用任何使用枚举的对象。 - 因此,这可以通过MyEnum变量实现,应该可以使用varX和varY原语,对吗? – denchr 2009-09-09 11:22:51