【问题标题】:Create interface for constant [duplicate]为常量创建接口[重复]
【发布时间】:2012-10-30 10:25:11
【问题描述】:

可能重复:
Interfaces with static fields in java for sharing ‘constants’

我们有很多需要在课堂和我的问题中使用的常量 是否是创建具有公共属性的接口的最佳实践 或者别的什么...

public static final String NAME = "Name";

谢谢!

【问题讨论】:

    标签: java


    【解决方案1】:

    您应该为此使用不可实例化的类,而不是接口。

    public final class Constants{
    
      private Constants(){}
    
      public static final String NAME = "Name";
    
      // more constants
    
    
    }
    

    根据 Joshua Bloch 在Effective Java 中的说法,接口应该只定义行为:

    常量接口模式是接口使用不当。 类在内部使用一些常量是一个实现细节。 实现一个常量接口会导致这个实现细节 泄漏到类的导出 API 中。对它没有任何影响 一个类的用户认为该类实现了一个常量接口。在 事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一种承诺:如果 在未来的版本中,该类被修改,使其不再需要 要使用常量,它仍然必须实现接口 确保二进制兼容性。如果一个非final类实现了一个常量 接口,它的所有子类的命名空间都会被污染 通过接口中的常量。

    来源:Effective Java,第 19 条:仅使用接口来定义类型

    【讨论】:

    • 感谢您的回答!您认为使用 final 类比使用枚举更好吗?谢谢!
    • @FedorE 如果你有可能使用枚举,那是最好的,但如果你需要字符串常量,枚举不能提供它们。
    【解决方案2】:

    我的建议是为常量创建一个类。不是接口,如果接口没有方法,那么它就没有达到它的目的。

    在接口中放置常量是早期流行的技术 Java 时代,但现在许多人认为它是一种令人反感的使用 接口,因为接口应该处理由 一个对象,而不是它的数据。同样,类使用的常量是 通常是实现细节,但将它们放在接口中 将它们提升为类的公共 API。

    看看here。

    【讨论】:

      【解决方案3】:

      -首先一口气回答你的问题......是的,这是可能的,事实上,如果你使用

      public int x=5; 或者

      int x=5,

      这将始终被解释为 public static final int x=5;

      -但这是不是正确的方法。

      -你最好使用Enum或Class with Private Constructor来处理这个问题。

      例如:

      具有静态字段的类:

         public class Test{
      
      
             public final String NAME = "Name";
      
             private Test(){}
      
      
            }
      
      }
      

      【讨论】:

      • 没有必要实例化只包含常量的类。
      • @SeanPatrickFloyd 你说得很对,但我想澄清一下"A class with static methods and static fields are equivalent to Sigleton Class", But this should Not be used, as the loading of which class and when by JVM is not a definite process. So Singleton is a safe bet.
      • 安全但多余。你的单身人士甚至没有保持不变的领域,所以它完全没有意义。另外:最好将单例类设为final
      • @SeanPatrickFloyd 我想你错过了我的代码中的常量字段 NAME ......请正确
      • @SeanPatrickFloyd 而且,如果你再仔细阅读一遍,你就会知道我也建议使用 Enum... 但提供了 Singleton 的例子......
      【解决方案4】:

      您应该避免在接口中使用此类常量。您可以采用 Sean Patrick Floyd 提出的解决方案。或者使用枚举类型作为常量。

      public enum Constants {
       NAME("Name");
      
       private final String constant; 
      
       private Constats(String constat) {
         this.constant = constant;
       }
      
       public String constant(){ 
         return this.constat; 
       }
      
      }
      

      当您的代码需要它们时,您应该使用枚举类型。然后你将在你的代码中有顺序。

      【讨论】:

      • 我同意枚举解决方案,但不幸的是,枚举的成员不是编译时常量,例如,它不能用于注释值。不幸的是,没有编译时常量方法可以从枚举中获取字符串
      • 你是对的。很好,你指出了这一点。我写它是因为看起来 OP 或其他开发人员不需要编译时常量,而只需要一个可以将占位符存储到代码中重用的字符串值的地方。
      猜你喜欢
      • 2017-04-20
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      相关资源
      最近更新 更多