【发布时间】:2009-09-09 03:21:47
【问题描述】:
以下枚举结构执行某些操作,同时对客户端类保持不可知性(出于封装原因)
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),因此无法区分..
您是否建议我在 Client 类中为每个 varX 和 varY 创建不同的自定义类型(以某种方式包装它们?)?
我希望我的问题不会太冗长。如果我不清楚,请告诉我。非常感谢。
【问题讨论】:
-
在“performMethod1(...)”中,您使用“getEnum().method1(...)”,因此它是执行 method1 而不是“enum”参数的客户端的枚举。我不确定您是否要使用参数“enum”来执行method1或什么?请清除更多。
-
是的,客户端只是委托给 MyEnum 类中的不同枚举来执行方法逻辑。但是由于 MyEnum 也是 Client 的成员变量,因此要更改 Client 的状态,我需要将 MyEnum 传递给其他方法……例如 method2()。那是不是更清楚了?感谢您的评论
-
我更新了 MyEnum 和 Client 代码,以显示 Client 委托给 MyEnum,MyEnum 保留对枚举的引用,并更改作为客户端属性的枚举的状态。 -- 目的是对 varX, varY Client 成员做同样的事情
-
>> 目的是对 varX、varY Client 成员做同样的事情 不命名 Client 怎么能做到这一点?正如我之前所说,要么枚举必须了解客户端,要么客户端必须打开枚举。由于枚举用于切换,这似乎是更好的方法:-)
-
我不确定我是否理解您所说的“命名客户”是什么意思?至于客户端开启枚举,这当然是一种方法,但目的是避免switch或if语句
标签: java design-patterns refactoring enums encapsulation