使用枚举扩展类 - java

时间:2012-04-08 19:56:26

标签: java oop design-patterns architecture

假设我有两个A和B类,它们的内部状态由枚举状态表示。 B类扩展了A以添加新功能,但它也增加了新的内部状态。确切地说,它通过将A`s状态中的一个分成两个新状态来增加细粒度的状态支持。

我还需要使用PropertyChangeSupport来监控状态更改。

目前,我在枚举状态的A类中定义了所有状态。我有保护方法setState()和getState()。为了从外部检查状态,我编写了方法isAvaible(),isComplete()等。这些方法仅在适当的类中出现,具体取决于它们的层次结构和状态支持。

我真的不喜欢这个想法,在父类中定义了所有状态。如何在Java中正确实现这一点?据我所知,它不可能在枚举中使用继承。

2 个答案:

答案 0 :(得分:4)

委托比继承更受欢迎。

enum StateA
{
       AVAILABLE , COMPLETE ;
}

class A
{
      private StateA state ;
}

enum StateB
{
     AVAILABLE_TO_PUBLIC ( StateA . AVAILABLE ) , AVAILABLE_INTERNALLY ( StateA . AVAILABLE ) , COMPLETE ( COMPLETE ) ;

     StateB ( StateA sa )
     {
          this . sa = sa ;
     }

     private StateA sa ;
}

class B
{
      private StateB state ;
}

答案 1 :(得分:1)

我认为你想放弃Enum概念,除非作为A类私人的东西来帮助你编程。 A的外部状态可通过isAvailable()和isComplete()等方法获得。 B类会扩展A,但不应该知道A的枚举,尽管它可能有自己的私有。如果更改需要影响A的状态,从而影响A的枚举StateA,则通过方法调用来完成。

A类或B类对象的“状态”应通过访问枚举值来确定,访问,使用或通过其方法 not 。换句话说,A或B的实例本身就是一个完整的国家定义。它可能不会像枚举那样命名状态,但它会告诉您需要知道的关于“状态”允许和可以做什么以及如何更改的所有内容。

或者,您可以设置每个人都可见的枚举并全局定义。然后枚举StateA完全独立于A类,解决了基本的设计问题。然后,类A和B以及其他类将依赖于StateA来提供它们用于彼此和系统其余部分进行通信的语言,从而实现更好的设计。

我有点像第一个想法更好,因为通过调整A和B,并扩展它们,你可以真正微调每个状态的含义,甚至可以添加新的状态,而无需正式宣布。 (向独立的StateA添加一个值并不是什么大问题,但是使用StateA的程序员可能想知道他们是否应该使用新值 - 这是一个小麻烦。)