【问题标题】:Java Enum methods - switch vs Overriding for each objectJava Enum 方法 - 为每个对象切换与覆盖
【发布时间】:2017-03-01 05:02:29
【问题描述】:

让我们考虑一个枚举。

用“switch(this)”为每个对象创建一个方法有什么区别 并为枚举中的每个对象创建一个抽象方法并覆盖它?

【问题讨论】:

  • 你能发布一些代码来说明你的想法......
  • 请阅读what type of questions not to ask上的help center。在这里,您基本上是在询问每个人对赞成和反对的意见,而没有要解决的实际问题。

标签: java enums switch-statement overriding abstract


【解决方案1】:

使用开关,您可以共享代码,同一代码的许多案例标签组合。

如果每个枚举都不同(或大部分不同),我会使用覆盖。

注意:您可以使用默认实现并覆盖不同的实现。

【讨论】:

    【解决方案2】:

    如果您不更改枚举,则不一定有区别。但是,让我们看一个例子:

    enum MyEnum {
        FIRST
        {
            @Override
            void foo() {
                //Do something
            }
        },
        SECOND
        {
            @Override
            void foo() {
                //Do something else
            }
        };
    
        abstract void foo();
    }
    

    现在,如果我们要向这个枚举添加一个新元素 THIRD,那么编译器会确保我们实际实现了这个方法。

    让我们来看看开关盒:

    enum MyEnum {
        FIRST,
        SECOND;
    
        void foo() {
            switch (this) {
            case FIRST:
                //Do something
                break;
            case SECOND:
                //Do something else
                break;
            default:
                break;
            }
        }
    }
    

    如果我们要添加一个新元素 THIRD,那么我们可能会忘记在 switch 语句中添加一个额外的 case,这意味着我们需要更加小心。

    另外一个区别就是 switch 可以用于这些枚举对象的外部功能,而我们不能向枚举本身添加其他方法。

    【讨论】:

      【解决方案3】:

      enum 方法的优点是遵循 Open/Closed 原则。如果需要扩展枚举,只需为新的枚举成员实现方法即可;否则你必须通过你的代码找到你的枚举用于涵盖所有可能性。

      缺点是,如果你对它过于严格,你可能会在你的代码中放太多东西。想象一下,您有一个涵盖业务级别的年龄范围的枚举,并且您希望在 UI 级别根据用户的年龄呈现不同的布局......显然,向枚举添加一个指定 HTML 详细信息的方法会破坏许多抽象级别。

      对于与枚举的“核心​​”功能相关的问题,我倾向于使用枚举方法,并在其他地方使用开关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 2016-07-02
        • 1970-01-01
        相关资源
        最近更新 更多