Interface在OO中处于核心地位,针对接口编程更是OOP的核心原则之一,但即使将该原则贯彻到底的COM/CORBA,依然面对大量的依赖、耦合,牵一接口而动全部客户的修改

另一方面,Hurb Sutter说各种编程范式,包括面向对象,核心都是某种管理依赖性,降低依赖性的技术,那么.Net Attribute, XDoclet, Java Annotation代表的Attribute Oriented Programming在降低依赖性上又前进了多少呢?

以Java Annotation为例,与Java Interface做个对比

1,调用方式

实现Interface的类 被Annotation标注的类
Call by Signature:就像现实生活中的螺丝螺母,插座插头,必须完全吻合 Call by Semantics:就像卡西利亚斯被罚下,临时指定肥罗当守门员一样,肥罗并不需要实现GateKeeper接口,只需临时被标记为具有GateKeeper属性,便可以合法的禁区内手球

2,名称冲突(可看作是对函数签名的依赖,当然,无论Annotation还是Interface,都不允许存在完全相同的全名)

实现Interface的类 被Annotation标注的类
Yes,无法解决从多个接口继承来的方法具有相同签名不同语义的问题 No,Annotation是类型,不会存在完全相同的全名

3,编译时依赖(对Annotation或Interface的依赖)

Annotation Interface
被Annotation标注的类 使用了Annotation的客户 不使用Annotation的客户 实现Interface的类 使用Interface的客户 不使用Interface的客户
Yes Yes No,只要“被Annotation标注的类”已经被编译为bytecode,如以jar包的形式存在,那么使用了该类,但没有用到Annotation的客户,编译时不需要依赖Annotation所在的Jar包 Yes Yes Yes,即使客户没有用到该类所实现的所有接口,编译时该类涉及的所有接口的定义必须可见

4,运行时依赖(对Annotation或Interface的依赖)

Annotation Interface
被Annotation标注的类 使用了Annotation的客户 不使用Annotation的客户 实现Interface的类 使用Interface的客户 不使用Interface的客户
No(即使RetentionPolicy是RUNTIME,我的测试中也是不依赖Annotation的,只要客户不涉及Annotation,但我不确定RUNTIME的真正含义是什么) Yes No(其实运行时对Annotation的依赖被转移到了客户) Yes Yes Yes

5,对Annotation或Interface本身更改的依赖

Annotation Interface
被Annotation标注的类 使用了Annotation的客户 不使用Annotation的客户 实现Interface的类 使用Interface的客户 不使用Interface的客户
Yes Yes No Yes Yes No

6,对“被Annotation标注的类不再被标注”或“实现Interface的类不再实现Interface”这类更改的依赖

Annotation Interface
被Annotation标注的类 使用了Annotation的客户 不使用Annotation的客户 实现Interface的类 使用Interface的客户 不使用Interface的客户
Yes No No Yes Yes No

总共 5 处被蓝色字体标注的地方,也就是Annotation在降低依赖性上优于Interface的 5 个方面,也算更接近于“你不需要为你用不到的东西付出代价”这一语言和库的设计理念

当然,Annotation有其它的代价,几个潜在的可能就是“使用方便性”和“性能”

Annotation PK Interface相关推荐

  1. java 中的 Annotation 注解学习笔记

    java 中的 Annotation 注解 什么是注解 元注解 @Target @Retention @Document @Inherited 自定义注解 什么是注解 Annotation 是从JDK ...

  2. @Query Annotation in Spring Data JPA--转

    原文地址:http://javabeat.net/spring-data-jpa-query/ In my previous post on Spring Data, I have explained ...

  3. Java Annotation

    为什么80%的码农都做不了架构师?>>>    第1部分 Annotation架构 先看看Annotation的架构图: 从中,我们可以看出: (01) 1个Annotation 和 ...

  4. Java Annotation认知(包括框架图、详细介绍、示例说明)

    摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...

  5. Java 给编译器看的注释--Annotation

    文章目录 1. 系统内建的Annotation 2. 自定义Annotation 3. Retention 4. 反射 与 Annotation 5. Target 6. Documented 7. ...

  6. java简单自定义Annotation

    为什么80%的码农都做不了架构师?>>>    原文内容比较多,这里就简单地说一下.java 5以后增加了3个annotation, @Override @Deprecated @S ...

  7. Java基础之理解Annotation

    2019独角兽企业重金招聘Python工程师标准>>> 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何 ...

  8. iOS annotation

    1. 添加到map view的子视图不会随地图的移动而移动,map view会固定其子视图的位置.如果要添加随着地图移动的子视图,可以使用annotations和overlays.annotation ...

  9. 如何使用Annotation

    经常看到别人使用自定义的Annotation,今天我也学了一把. 如我们经常这样通过注释来描述一个类的信息: /*------------------------------- Created: Ja ...

最新文章

  1. 可变分区存储管理实验报告总结_操作系统实验报告-可变分区存储管理方式的内存分配回收...
  2. javascript DOM 编程艺术----笔记
  3. 带有支付功能的产品如何进行测试
  4. 服务器系统装软路由,服务器系统设置软路由
  5. 什么是透明传输 点对多传输? 它们有哪些经典应用和优势特点
  6. c语言汇编混合编程方法,C语言和汇编语言混合编程方法
  7. android imageview 图片切换动画,在Android中以动画方式将ImageView移动到不同的位置...
  8. jenkins启动/重启/停止命令 改端口
  9. python 重写抽象类编译错误_从零开始的Java之旅5.0继承、super、this、抽象类
  10. spring mvc文件上传与下载
  11. NetBeans 时事通讯(刊号 # 120 - Oct 14, 2010)
  12. OpenCasCade标注显示类(独立)
  13. 《一页纸项目管理》读书笔记
  14. 【虚幻4】浅析UE4中的C++
  15. 用python制作动态二维码_用Python制作动态二维码
  16. Linux 之用户管理与文件权限
  17. 机器学习:python实现LDA降维算法
  18. win7 IIS7.0 【IIS 管理器无法验证此内置帐户是否有访问权】
  19. linux u盘修复引导文件,centos bootloader安装到u盘后修复方法
  20. java tcp 乱码_Java和C++通过Socket通信中文乱码的解决

热门文章

  1. 智能组件和木偶组件_一周前五篇文章:Linux,木偶和巨魔
  2. 快递代领--需求分析
  3. 大话直播,做直播看我就够了
  4. select实现多选
  5. 冰蝎各个版本的更新日志
  6. Windows Docs
  7. 数据库|Mysql基础思维导图总结
  8. 亚马逊 新版卖家中心 销售伙伴API SP-API SELLING-PARTNER-API Python SDK 客户端 接口调用
  9. ArcGIS皮尔逊相关系数
  10. web性能优化SEO