枚举是否违反开放/封闭原则Java?

时间:2016-07-15 09:59:10

标签: java oop enums solid-principles open-closed-principle

在java中,如果我们使用枚举并且最终我们想要从该枚举中添加/删除属性,从而使用它,我们在实体原则中违反了开放/封闭原则。

如果是这样,枚举的更好用法是什么?

3 个答案:

答案 0 :(得分:8)

答案是,因为OCP不适用(并且无法应用)到枚举。枚举应该是完整的(包含所有可能的值)和静态的(静态=最终的,不可变的)。您可以将它们视为一组有限的小值对象。

如果你想要一些可以扩展的东西,你总是可以使用一个类或构建你自己的"type-safe enumeration"可以扩展。

关于语言。我选择使用术语 apply 而不是违反作为原则,因为许多好的做法都有一个适用它们的上下文。违规(对我而言)意味着情况要求使用原则,但未使用或未正确实施。 它不适用意味着它在锡上所说的,原则在当前环境中没有用或者它不能被应用,否则将违背其他具有更强力的原则......在上下文中:)。

修改

我认为Enums不会违反OCP的另一个原因(现在我使用违反:D这个词)是因为OCP并不意味着所有的类和方法可以扩展,而是一个尽职尽责的开发人员做出明智的决定,在哪里放置这些扩展点。在Enum的情况下,开发人员理解不需要扩展可能的值,并且进一步增加新值会有害,因为现有代码不知道该怎么做有了新的价值。所以他/她决定完全关闭课程而不提供扩展点。这同样适用于final的任何其他类。 final类并不违反OCP,而是(或理想情况下)开发人员决定不允许扩展OCP。

这与我之前提到的类似,Enums就像一组有限的小值对象。 VO是不可变的和封闭的,因此他们不会违反OCP。

为了增加更多内容,我发现有些图书馆没有正确实施OCP(Tapestry 5)并且需要做出超过最终的结果,这使得它们成为了PITA。或者只是没有关闭任何东西,这使得一些开发者犯错误,因为他们没有理解库的更精细的细节,并搞砸了不变量。

答案 1 :(得分:3)

答案是。所有Java枚举都违反了开放/封闭原则,因为它们无法在不进行修改的情况下进行扩展。

更好地使用枚举"在Java中,要让它们实现一个接口,并让客户端依赖于该接口而不是枚举实现,因为接口不违反开放/封闭原则。

同时考虑来自@MarkRotteveel的评论,"开放/封闭是一个原则,而不是一直需要遵循的教条。"

答案 2 :(得分:0)

打开/关闭以及所有SOLID原则旨在简化重构并理解代码。您应该根据上下文使用它。

只要枚举类型必须是一组众所周知的值,你就不应该这样写:

enum Fruits {apple, pear, banana}
enum Food extends Fruits {chicken}

有三个原因:

1)Java不允许它。

2)鸡肉绝不是水果

3)水果不再是众所周知的完整价值观

如果你使用Enum来定义,例如,太阳系的行星和一颗新行星被发现或旧的行星失去其状态(或被外星人摧毁),可以将你的课程修改为调整新要求。

相关问题