我应该何时以及如何使用枚举类而不是枚举?

2024-04-05

一位开发人员最近开始在通常适合枚举的地方使用类模式而不是枚举。相反,他使用类似于下面的内容:

internal class Suit
{
    public static readonly Suit Hearts = new Suit();
    public static readonly Suit Diamonds = new Suit();
    public static readonly Suit Spades = new Suit();
    public static readonly Suit Clubs = new Suit();
    public static readonly Suit Joker = new Suit();
    private static Suit()
    {

    }
    public static bool IsMatch(Suit lhs, Suit rhs)
    {
        return lhs.Equals(rhs) || (lhs.Equals(Joker) || rhs.Equals(Joker));
    }
}

他的理由是,它无形中看起来像一个枚举,但允许他将与枚举相关的方法(如上面的 IsMatch)包含在枚举本身中。

他称其为枚举类,但这不是我以前见过的东西。我想知道优点和缺点是什么以及在哪里可以找到更多信息?

Thanks

编辑:他描述的另一个优点是能够为枚举添加特定的 ToString() 实现。


枚举在很多情况下都很好,但在其他情况下却很差。通常我会发现一些问题 与枚举:

  • 与枚举相关的行为分散在应用程序中
  • 新的枚举值需要霰弹枪手术
  • 枚举不遵​​循开闭原则

由于枚举行为分散,我们永远无法将其返回到源类型,因为枚举类型不能有任何行为(或与此相关的状态)。

另一方面,枚举类:

每个枚举类型的所有变体不仅可以下推到枚举类,还可以下推到每个特定的子类型。

枚举在各种场景中都能很好地工作,但在域模型中可能会很快崩溃。枚举类提供了大部分相同的可用性,并具有成为行为目的地的额外好处。

Switch 语句不再是必要的,因为我可以将可变性和知识推回到模型内部。如果由于某种原因我需要检查特定的枚举类值,该选项仍然对我开放。这种模式不应该取代所有枚举,但有一个替代方案是很好的。

可以阅读here http://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该何时以及如何使用枚举类而不是枚举? 的相关文章

随机推荐

  • 设置 FieldRenderer 的 Item 或 DataSource 属性的好方法是什么?

    场景是我有很多 FieldRenderer 这些应该从不同的地方输出数据 一些来自项目 X 另一些来自项目 Y 并且应该输出项目 Z 的属性 假设我有公共财产ItemX我想从中输出一个属性 以下任何一个都可以 但我没有得到他们中任何一个的输
  • Angular2 路由 - 当路由更改时保持组件的状态[重复]

    这个问题在这里已经有答案了 我有一个应用程序 其视图位于路由后面 我需要能够从路由更改时的位置继续 但返回后 组件处于初始状态 有什么办法可以保持组件的状态吗 update 2 现在已针对新路由器修复了这个问题 Angular 2 3 ht
  • 如何在 MATLAB 中随机排列 3D 矩阵中的列

    我有 3D 矩阵 10000 x 60 x 20 我需要排列第二维和第三维以保持列完整 对于 2D 矩阵 我使用 RANDPERM pidx randperm size A 2 Aperm A pidx 我不能只应用 RANDPERM 两次
  • 如何在表中表示 nil

    假设我想存储一个元素列表 包括一些零值 值的位置很重要 我需要表示列表中给定位置处不存在值 这里有一个问题 a 1 2 3 nil 4 for k v in ipairs a do print k v end print a 4 print
  • html中的方括号是什么意思?

    我现在正在协助一个项目 第一次构建模板 试图解决一些问题 但 html 中令我困惑的一个方面是方括号中的某些内容 我以前从未在 html 中使用过这些 所以我只是想知道它们的用途 当我在浏览器中打开页面时 它们都显示为文本 这是一些代码 d
  • Excel - 多项选择下拉列表 - 不重复选择

    我在 Excel 电子表格上开发了可以使用以下代码在下拉列表中选择多个项目的方法 Private Sub Worksheet Change ByVal Target As Range Dim rngDV As Range Dim oldVa
  • 如何使用 CakePHP APP 类从 URL 加载 XML 文件?

    我正在使用 CakePHP XmlHelper 来解析 XML 文件 例如 App import Xml file my xml file xml parsed xml new XML file 我如何使用它从 URL 加载 XML 文件
  • MySQL 日期比较过滤器

    我有一些运行良好的 SQL 代码 并从我的 Wordpress 数据库返回所需的结果 但是 我根本无法理解如何过滤以下日期之间的日期 2010 12 10 00 00 00 and 2010 12 15 00 00 00 这是我的 SQL
  • 如何使用 ffmpeg-python 在视频上叠加帧序列?

    我在下面尝试过 但它只显示背景视频 background video ffmpeg input input mp4 overlay video ffmpeg input f frames folder png pattern type gl
  • 跳过多个号码

    我正在尝试将正则表达式用于我正在做的工作项目 我有一组数字 如下所示 23 14 62 121 98 0 0 0 1 0 0 0 2 165 60 00 24 13 64 118 101 0 0 0 1 0 0 0 2 165 60 00
  • VBA更改模块中的实例变量(excel)

    在 VBA 中 我需要一个模块 sub 来告诉实例设置一些变量 在模块 1 中我有 Sub Load ThisWorkbook SetupVariables ThisWorkbook TestVariables End Sub 在本工作簿中
  • 在Windows下使用通过MSYS2安装的cmake 3.5.2,缺少“MinGW Makefiles”生成器

    我正在尝试使用 MinGW 作为编译器 在 Windows 下进行 hello world 测试来制作 cmake 这个答案 https stackoverflow com a 4101496 4063051建议运行cmake与 G标志如下
  • 在 Mac OS X 中从相机捕获视频

    如何在 MacOS X 中过滤来自摄像头的视频流 我编写了 QuickTime 序列采集器通道组件 但仅当应用程序使用 SG API 时它才有效 如果应用程序使用 QTKit Capture 则该组件无法工作 有人知道我该如何实施它吗 您可
  • 如何围绕未正确发布的值演示竞争条件?

    我正在阅读 Java 并发实践 并查看第 51 页的示例代码 根据该书 这段代码如果没有正确发布 就有失败的风险 因为我喜欢编写示例代码并分解它们以证明它们是如何工作的 我尝试让它抛出 AssertionError 但失败了 引导我走向我的
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • 如何在java中打开所有以特定前缀开头的文件?

    有没有办法在Java中打开以特定名称开头的目录中的某些文本文件 例如 在我的目录中 我有以下文件 Ab 01 txt Ab 02 txt Ab 03 txt Ab 04 txt SomethingElse txt NotRelated tx
  • 学说问题(映射不一致)

    我正忙于 Symfony 中的一个项目 我只是检查分析器选项卡并看到 2 个错误不断弹出 它们如下 The mappings MyBundle MainBundle Entity School provinceId and MyBundle
  • 在 netbeans 中创建/访问库

    我是新的 netbeans 用户 在导入用户创建的库时遇到问题 我创建了一个名为 MyLibrary 的库 然后 我将一个包含我保存的项目 名为 netbeansProjects 的文件夹添加到类路径中 该文件夹是我在 netbeans I
  • mysql_connect 在远程主机连接上返回“无法通过套接字连接到本地 MySQL 服务器”?

    我有一台服务器返回一个意外的间歇性错误 想知道是否有人以前经历过它或者可以猜测可能会发生什么 到目前为止我的搜索还没有结果 我以通常的方式使用 mysql connect 连接到远程 mysql 服务器 但在过去 2 周 每天几次 与数据库
  • 我应该何时以及如何使用枚举类而不是枚举?

    一位开发人员最近开始在通常适合枚举的地方使用类模式而不是枚举 相反 他使用类似于下面的内容 internal class Suit public static readonly Suit Hearts new Suit public sta