繁体   English   中英

使用枚举扩展 class - java

[英]Extending class with enum - java

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

我还需要使用 PropertyChangeSupport 来监控 state 的变化。

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

我真的不喜欢这个想法,所有状态都在父 class 中定义。如何在 Java 中正确实现它? 据我所知,不可能将 inheritance 与枚举一起使用。

委托优先于inheritance。

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 ;
}

我认为您想放弃 Enum 概念,除非是 class A 的私有内容以帮助您对其进行编程。 A 的外部 state 可以通过 isAvailable() 和 isComplete() 等方法获得。 Class B 会扩展 A 但应该对 A 的枚举一无所知,尽管它可能有自己的私有枚举。 如果更改需要影响 A 的 state,并因此影响 A 的枚举 StateA,请通过方法调用来完成。

class A 或 B 的 object 的“状态”应该通过其方法而不是通过访问枚举值来确定、访问、使用或进行任何操作。 换句话说,A 或 B 的实例本身就是 state 的完整定义。它可能不会像枚举那样命名state,但它会告诉您关于“状态”允许和可以做什么的所有信息以及如何改变它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM