【问题标题】:Interfaces vs. enums接口与枚举
【发布时间】:2010-03-27 07:46:58
【问题描述】:

在接口和枚举之间,声明常量哪个更好?为什么会这样?

【问题讨论】:

    标签: java enums


    【解决方案1】:

    使用枚举来声明常量总是更好,因为接口的目标处于完全不同的级别。是的,有很多接口都有public static final 常量,但我觉得枚举的唯一工作就是为您提供这些常量。

    【讨论】:

    • public static final 常量来自enum 之前的时间。 :)
    • @Bombe,这并不完全正确。如果今天要重写 java.lang.MathPIE 仍将声明为 public static final double 常量。
    • 是的,当然,因为我上次检查Math不是一个接口。
    【解决方案2】:

    如果您的常量有特定类型的原因,如果它们需要某种行为(即方法),或者如果它们是其他值的组合,enums 是要走的路。

    例如,假设您正在实现一个纸牌游戏,并且您想要表示值和花色:

    enum Rank { 
        ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, 
        EIGHT, NINE, TEN, JACK, QUEEN, KING; 
    }
    enum Suit { SPADES, CLUBS, DIAMONDS, HEARTS } 
    

    在那里,现在不可能用虚假的套装或等级创建卡片。

    但有时,您只是对在某处声明一堆常用值感兴趣。在这种情况下,将它们放在enum 中只是不必要的努力,因为这些常数只是一种工具,可以让我们在计算圆的周长或其他东西时避免记住所有小数,例如 π。哪个更好看?

    // Using enum:
    enum MathConstant { 
        PI(3.14159265358979323846), E(2.7182818284590452354);
        private final double value;
        MathConstant(double v) { value = v; }
        public double value() { return value; } 
    }
    // Usage:
    double circumference = MathConstant.PI.value() * diameter;
    
    // Using a constant class:
    final class MathConstants { 
        private MathConstants() { throw new UnsupportedOperationException(); }
        public static final double PI = 3.14159265358979323846,
                                   E = 2.7182818284590452354;
    }
    // Usage:
    double circumference = MathConstants.PI * diameter;
    

    关于接口:永远不要在接口中放置常量。 “常量接口”模式很糟糕(justification),自从import static 被添加到 Java 以来,唯一使用它的参数已经被渲染为无效。

    【讨论】:

    • Apache 的公共接口 HttpStatus 将常量放在接口中,您建议不要这样做。示例 - int SC_OK = 200;类可以通过 HttpStatus 的静态导入来使用这些常量。这里接口的使用还有问题吗?
    • 嗯,有点。反对带常量的接口的主要原因是它使implement 接口变得容易和舒适,只是为了避免导入常量。也有反对它的语义原因;接口是一组可以实现的行为,而不是一袋常量。现在,类在语义上也不是真正正确放置常量的地方,但它们可以被设置为最终的和不可实例化的,这使得它们的行为更像子命名空间而不是类(这是我们想要的)。
    【解决方案3】:

    接口用于定义常见行为,枚举用于定义常见值。

    Enum 代表一个真实值,可以与另一个值进行比较,或者很容易地存储在数据库中。 您还可以有一个标志枚举(在 C# 中,在 Java 中不知道),它可以让您对枚举的值(AND、OR、XOR 等)执行二进制操作。

    【讨论】:

    • 在 Java 中,枚举基本上是(常量)类,因此与 .net 4.0 之前的 c# 中的枚举相比,您可以使用它们做更多的事情。我认为 C# / .net 4.0 将实现此功能。
    • @Tedil:C# 4.0 功能集已经完成。它不包括增强的 OO 枚举。
    【解决方案4】:

    如果您使用 Java 5 或更新版本,那么 Enum 是您的最佳选择。唯一的例外是您的 const 列表是开放的并且可以扩展。枚举不能扩展。另一个例外是它是像 MAX_INTEGER 这样的单个值。

    【讨论】:

      【解决方案5】:

      只是一个代码:

      public interface InterfaceForConstants() {
          String **TOTO** = "Et voilà !";
          double **PI** = 3.14159265358979323846;
      }
      

      使用:

      class ClasseName implements InterfaceForConstants () {
      
          String myString;
      
          if (myString.equals(**TOTO**) {
              // do something
          }
      
          double circumference = **PI** * diameter; // instead of MathConstants.PI * diameter;
      
      }
      

      干净简单。如果某样东西可以满足你的需要,那就选择最简单的吧! 按规则编写代码是好的,编写易于阅读的代码更好,即使不遵守规则。想想几个月后你什么时候必须阅读你的代码。 如果你想更具体,做一个javadoc来解释吧!

      【讨论】:

      • 这不干净,这太糟糕了
      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多