Java设计:枚举状态



我意识到(也阅读了SO上的其他帖子)将状态添加到枚举常量是一个糟糕的设计(或者更好地说,在我的情况下,这也没有意义)。

尽管如此,我发现自己现在正处于一种需要类似的东西的境地。我正在编写的应用程序使用错误常量(enum),通过将它们添加到Map<Error, ErrorInfo>中来指示错误(请注意,这些不是应用程序错误,而是应用程序中的"错误")。我现在意识到,我实际上还需要为这些指示一个错误级别INFO、WARN、FATAL。由于Error的ErrorLevel取决于它发生的上下文,因此我不能静态地将ErrorLevel分配给Error枚举,换句话说,Error.E1一次可以是ErrorLevel.WARN,但另一次可能是ErrorLevel.FATAL

我正在考虑如何最好地将这个ErrorLevel结合到我的设计中,但到目前为止,我所想到的只是引入一个新的类,它简单地封装了一个Error和一个ErrorLevel,并在Map而不是Error中使用它。

由于错误及其严重性在我看来一定很常见,我相信有更聪明的方法可以做到这一点,所以我非常感谢你关于如何更好地设计它的想法。

--qu

如果我正确理解了您的问题,那么在枚举中放入瞬态不会有任何效果。由于通过更改错误级别,每个枚举类型只有一个实例,因此您不仅会针对正在评估的当前错误进行更改,还会针对应用程序中相同类型的所有错误进行更改。

您写道,错误级别取决于上下文,同时ErrorInfo描述了错误发生的上下文。如果你可以根据错误类型和上下文来计算错误级别,我建议使用一些静态方法

public static ErrorLevel getLevel(Error, ErrorInfo) {
  //..
}

我完全不同意向枚举添加可变状态总是糟糕的设计。枚举类似于singleton,只要在应用程序中使用有状态的singleton是有意义的,就可以对枚举执行同样的操作。就像单身人士一样,我们只需要记住,状态的改变会产生相当大的全球影响。

当然,有状态枚举对您的情况没有帮助,因为您需要特定于上下文的错误级别。

作为一种替代方案,可以考虑使用一个简单的多映射:

Map<Context, Map<Error, ErrorLevel>> errors;

这个想法是为不同的上下文存储多个映射。因此,对于一个已知的上下文(我很快发明了一种类型…),您可以获得特定于上下文的参数映射。

最新更新