美文网首页
Effective Java - 为后代设计接口

Effective Java - 为后代设计接口

作者: DZQANN | 来源:发表于2022-06-05 22:38 被阅读0次

第21条 为了后代设计接口

  1. 从Java 8开始,可以给接口加上方法,而不破坏现有的实现。
  2. 并不是永远都能写一个在任何情形下都适用的默认方法实现。比如removeIf,Apache的SynchronizedCollection实现允许一个外部对象作为锁,如果使用removeIf可能会抛出异常或者其他未知行为。
  3. 在有默认方法出现的时候,接口之前存在的实现可能可以通过编译,但是可能在运行时失败。
  4. 尽量避免利用缺省方法在现有接口上添加新的方法

思考

  1. default方法的主要作用更像是是为了给接口添加新方法的时候兼容老版本,所以我们尽量不要在一开始定义接口的时候就使用default方法
  2. default方法的引入,使抽象类和接口的边界变得越来越模糊。个人感觉这种情形更应该选择的还是抽象类,理由就是接口的意义就是定义一组行为的集合,它应该只定义行为,不应该去定义实现。并且抽象类中可以定义属性,本身就更加适合加入方法的实现

第22条 接口只用于定义类型

  1. 常量接口是指:没有包含任何方法,只包含静态的final域,每个域都导出一个常量

  2. 常量接口模式是对接口的不良使用:

    • 类在内部使用常量,就是实现细节
    • 类实现了常量接口,对于这个类而言没有任何价值
    • 对于一个已经实现了常量接口的类,未来实现改变不需要定义的常量值了,也不可以轻易的断开实现,因为需要保证兼容性
  3. 从Java7开始,下划线的使用已经合法了,对于数字的值没有任何影响:

    public class Constants {
        public static final double ELECTRON_MASS = 9.109_383_56e-31;
    }
    
  4. 接口应该只被用来定义类型,不应该被用来定义常量

思考

  1. interface中定义的常量,一定是public static final的,在使用上不如Constants类灵活
  2. 对于第2条说的几点原因,后面两点有些牵强。我们在开发中不会实现常量接口,就像我们不会继承常量类一样

相关文章

  • Effective Java 3rd 条目21 为后代设计接口

    在Java8之前,添加方法到接口而没有破坏已存实现,是不可能的。如果你添加了一个新方法到接口,已存实现通常缺少这个...

  • Java基础

    JAVA开发六大原则 抽象类和接口的对比 如何去设计类和接口(Effective Java) 1、使类和成员的可访...

  • Effective Java 第三版——21. 为后代设计接口

    Tips《Effective Java, Third Edition》一书英文版已经出版,这本书的第二版想必很多人...

  • 提示二十一

    今天来看提示二十一:为后代设计接口。 在java8之前,如果想要为一个接口添加新的方法,那么所有的实现类都要去实现...

  • Java学习书

    《Java编程思想》 《大话设计模式》 《重构 改善既有代码的设计》,《effective java》 《深入理解...

  • Effective Java(3rd)-Item21 为后代设计

      在Java8之前,不可能在不破坏现有实现的情况下向接口添加方法。如果在接口中添加新方法,通常现有的实现缺少该方...

  • 个人技术文章系列汇总(csdn)

    Java基础 Effective Java读书笔记 java 几种加载驱动的方法 《重构改善既有代码的设计》代码的...

  • Effective Java for Android

    Android 版《Effective Java》 翻译原文 Effective Java for Android...

  • ej3-0开端

    开始 编码多年,总有一些最佳实践,Java也是,比如设计模式,比如Effective Java 3 (ej3) 。...

  • 《Effective Objective-C 2.0》读书/实战

    《Effective Objective-C 2.0》读书/实战笔记 二 第3章:接口与API设计 ?? 第15条...

网友评论

      本文标题:Effective Java - 为后代设计接口

      本文链接:https://www.haomeiwen.com/subject/gtzdmrtx.html