2009-09-09 55 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