【问题标题】:How final constant class with no instances is better than constant interface?没有实例的最终常量类如何优于常量接口?
【发布时间】:2011-12-30 08:12:16
【问题描述】:

在阅读常量接口反模式时,我发现没有实例的最终常量类比常量接口更好。
请解释一下如何?

public interface ConstIfc {
  public static final int constValue = 10;
}

public final class ConstClass {
  private ConstClass{}
  public static final int constValue = 10;
}

如果必须在 UtilClass 中使用 constValue 而没有命名 Ifc/Class 名称,我们可以实现/扩展它们。但实现支持多重继承。那么如何更好地延伸呢?
注意:我能够理解静态导入。

【问题讨论】:

    标签: java class interface constants


    【解决方案1】:

    我认为参数是您不需要扩展或实现常量类或接口,因为我们有静态导入。因此,如果您要使用静态导入,则为常量创建一个类更符合类的实际含义,而不是接口的含义。并且将其作为最终类消除了应用反模式的诱惑;即扩展或实现定义常量的类型。

    但在实践中,我认为您使用哪种模式并没有太大的区别。

    【讨论】:

    • 太棒了!谢谢。所以 final 类在静态导入和避免继承所有常量方面优于常量接口。是吗?
    • 由于静态字段对象是在类级别创建的(并且对所有对象都是通用的),是否对特定字段进行静态导入并继承(使用实现)所有字段将创建相同数量的内存?跨度>
    • 例如在下面的这个程序中,创建了多少个 MyOwn 对象? code class MyOwn{} public interface ConstantIfc { public final static MyOwn REF = new MyOwn(); } A 类实现 ConstantIfc {} B 类实现 ConstantIfc {} public class c { public static void main(String... arg) { A refA = new A(); B refB = 新 B(); } }
    • 只有一个,因为它在 ConstantIfc 中是静态的。
    【解决方案2】:

    您应该考虑使用Enums 而不是带有常量的类/接口。它是更加灵活、强大和稳健的选择。

    【讨论】:

    • 是的,但并不总是最好的。例如,DAYS_IN_WEEK 或 PI 或任何数量的其他真实常量似乎最好用普通的 ole int 来描述。
    【解决方案3】:

    接口是一种抽象,为了保持抽象,它们不应包含实现细节(包括常量变量)。接口也经常用于描述不属于实现细节的公共 API。因此,将常量数据放入类而不是接口中是有意义的。

    我不确定您所说的“如何更好地扩展?” 是什么意思,但我认为您应该避免将这种实现细节继承/扩展到多个类中。不恰当地利用实现继承通常会导致设计不灵活。在您的示例中,ConstClass 上的 final 关键字利用编译器来阻止您执行此操作,而接口无法做到这一点。

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2010-12-28
      • 2011-07-18
      • 2017-04-20
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      相关资源
      最近更新 更多