【问题标题】:linking methods from an enum to member variables of client class将枚举中的方法链接到客户端类的成员变量
【发布时间】: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


【解决方案1】:

您希望Client 发生不同的事情,具体取决于MyEnum 的不同值。如果MyEnum 必须与客户端无关,那么Client 将不得不识别MyEnum 的不同状态(Client.performMethod1 中的一个开关),或者一个单独的处理器类将实现该逻辑。

【讨论】:

  • 我明白这一点,但目标是避免客户端中的 switch/if 语句。枚举已经内置了所有备选方案例如,在 MyEnum 中未显示的另一种方法中,比如说方法 2,我可以对 MyEnum 案例本身进行操作。然后,在客户端中,我可以将其包装在 performMethod2(MyEnum enum) 中并更改客户端的枚举状态
  • 我编辑了我的原始帖子以在 MyEnum 中包含 method2()。现在更好地表明,Client 能够通过 performMethod2() 简单地委托给 MyEnum,保持其状态和行为封装,而 MyEnum 基本上与 Client 无关 - 没有对使用其枚举的任何对象的引用。 -- 因此,既然这可以通过 MyEnum 变量实现,那么它应该可以通过 varX 和 varY 原语实现,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多