以下枚举结构执行某些操作,同时保持对客户端类的不可知性(出于封装原因)
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创建不同的自定义类型(以某种方式将它们包装?)?
我希望我对这个问题不太啰嗦。如果我不清楚,请告诉我。非常感谢。
答案 0 :(得分:1)
根据Client
的不同值,您希望MyEnum
发生不同的事情。如果MyEnum
必须与客户端无关,那么Client
必须识别MyEnum
的不同状态(Client.performMethod1
中的切换)或单独的处理器类将具有实现那个逻辑。