2

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

我还需要使用 PropertyChangeSupport 来监控状态变化。

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

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

4

2 回答 2

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 ;
}
于 2012-04-08T20:04:33.417 回答
1

我认为您想放弃 Enum 概念,除非将其作为 A 类私有的东西来帮助您对其进行编程。A 的外部状态可通过 isAvailable() 和 isComplete() 等方法获得。B 类将扩展 A,但对 A 的枚举一无所知,尽管它可能有自己的私有枚举。如果更改需要影响 A 的状态,进而影响 A 的枚举 StateA,请通过方法调用来完成。

A 类或 B 类对象的“状态”应该通过其方法来确定、访问、使用或其他方式,而不是通过访问枚举值。换句话说,A 或 B 的实例本身就是状态的完整定义。它可能不会像枚举那样命名状态,但它会告诉您您需要了解的有关“状态”允许和可以做什么以及如何更改它的所有信息。

或者,您可以设置一个对所有人可见的枚举并在全局范围内定义它。那么枚举StateA完全独立于A类,解决了基本的设计问题。然后,A 类和 B 类以及其他类将依赖 StateA 提供它们用来相互通信以及与系统其他部分通信的语言,从而实现更好的设计。

我更喜欢第一个想法,因为通过调整 A 和 B 并扩展它们,您可以真正微调每个状态的含义,甚至可以在不发布正式公告的情况下添加新状态。(向独立的 StateA 添加一个值不会有什么大不了的,但使用 StateA 的程序员可能想知道他们是否应该使用新值 - 一个小麻烦。)

于 2012-04-09T18:37:16.333 回答