【问题标题】:Why language designers allow interface to contain fields?为什么语言设计者允许界面包含字段?
【发布时间】:2015-12-20 01:54:50
【问题描述】:

根据 Effective Java 中的第 19 条,必须使用接口来仅表示一种类型。在这种情况下,接口将包含构成公共合约一部分的方法,这些方法由类(实现接口)公开给客户端

如果是这样,为什么接口首先支持字段?由于这些字段是隐含的公共、静态、最终的(因此是常量),为什么语言设计者支持拥有它们?如果它们不受支持,那么开发人员将总是使用 utils 类(带有私有构造函数)来定义这些常量。只能自动避免使用常量接口的反模式

我正在考虑了解在界面中支持常量的原因。作为与客户签订的合同的一部分,它们是否必不可少?

谢谢

【问题讨论】:

  • " 如果它们不受支持,那么开发人员总是会使用 utils 类(带有私有构造函数)来定义这些常量。” 这也很丑陋。
  • 呃,因为Java早在本书出版之前就已经设计好了?而且因为 Effective Java 不是语言规范,只是一组质量参差不齐的建议?
  • @Tom,可能。但至少接口暴露的合约在某种意义上不会是脏的,并且包含不指示任何类型行为的常量。
  • 许多好的问题会根据专家的经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。
  • 语言结构几乎总是源于一些创造性的想法,然后在实践中进行测试。引入接口是为了消除多重继承。它们看起来像代数类型,并且这些类型通常具有区分常量,例如 HOR/VERT、R/G/B、MAX:STACK_SIZE(最好是类型参数)。因此,开始 没有 常量需要一个尚未可能的洞察力,如果没有它们,该接口可能会做得更好。

标签: java interface constants


【解决方案1】:

作为与客户签订的合同的一部分,它们是否必不可少?

如果常量可以作为一个或多个接口方法的参数给出,或者常量是一个或多个接口方法的文档特殊返回值,则它们是。

使用接口来保存常量以便类使用是一种反模式,关于此的文章有很多,但是拥有专门供接口中定义的方法使用的常量是有效的自己。

但是,使用 enum 类型和新的 Java 8 Optional 将消除此类特殊常量的大多数用例,因此它们在现实生活中很少见。


例如,InputStream.read() 方法都返回 -1 表示“流结束”。当然,这是有据可查的,但如果InputStream-1 定义了END_OF_STREAM 常量,使用这些方法会不会更好地自我记录?

while ((len = inputStream.read(bytes)) != InputStream.END_OF_STREAM) {

// or using a static import:
while ((len = inputStream.read(bytes)) != END_OF_STREAM) {

好吧,好吧,InputStream 是一个抽象类,而不是一个接口,虽然它应该是,所以不是一个完美的例子,但它说明了我试图提出的观点。

【讨论】:

    【解决方案2】:

    其中一个原因可能是接口契约所必需的常量。例如,考虑以下接口:

    /**
    * Generates a probability distribution on a
    * specified interval.
    */
    public interface DistributionGenerator{
        /*
        * Gets a probability distribution on the specified
        * interval. The exact distribution is unique to the 
        * implementor of this interface. The distribution will
        * be represented as an array of doubles. The first number
        * in the returned array will be the probability at start
        * The last number will be the probability at end. All numbers
        * in between will be probabilities at evenly spaced 
        * intervals between start and end, with the spacing between values
        * given by the constant INTERVAL
        */
        public double[] getDistribution(double start,double end);
    
        public static final double INTERVAL = 0.000001;
    }
    

    但是,正如您所观察到的,大多数时候您在接口中看到常量都是为了简单地公开常量,这就是generally considered bad practice

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-09
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2021-09-10
      • 2014-02-19
      相关资源
      最近更新 更多