次の列挙型構造は、クライアント クラスにとらわれずに特定の操作を実行します (カプセル化の理由により)。
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 のそれぞれに異なるカスタム タイプを作成することをお勧めしますか (何とかラップしますか?)。
質問が冗長すぎないことを願っています。よくわからない場合はお知らせください。どうもありがとう。