接口和枚举

接口

Java中的 interface (接⼝)是⼀种表⽰抽象数据类型的好⽅法。接⼝中是⼀连串的⽅法标识,但是没有⽅法体 (定义)。如果想要写⼀个类来实现接⼝,我们必须给类加上 implements 关键字,并且在类内部提供接⼝中⽅ 法的定义。所以接⼝+实现类也是Java中定义抽象数据类型的⼀种⽅法。

在Java代码中,接⼝被⽤的很⼴泛(但也不是所有类都是接⼝的实现),这⾥列出来了⼏个使⽤接⼝的好处:

  • 接⼝对于编译器和读者来说都是重要的⽂档:接⼝不仅会帮助编译器发现ADT实现过程中的错误,它也会帮助 读者更容易/快速的理解ADT的操作——因为接⼝将ADT抽象到了更⾼的层次,⽤户不需要关⼼具体实现的各 种⽅案。
  • 允许进⾏性能上的权衡:接⼝使得ADT可以有不同的实现⽅案,⽽这些实现⽅案可能在不同环境下的性能或其 他资源特性有很⼤差别。使⽤者可以根据⾃⼰的环境/需求选择合适的实现⽅案。但是,在我们选择特定的⽅ 案后,我们依旧要保持代码的表⽰独⽴性,即当ADT发⽣(内部)改变或更换实现⽅案后代码依然能正常运⾏。
  • 通过未决定的规格说明给实现者以定义⽅法的⾃由:例如,当把⼀个有限集合转化为⼀个列表的时候,有⼀ 些实现可能是使⽤较慢的⽅法,但是它们确保这些元素在列表中是排好序的;⽽其他的实现可能是不管这些 元素转换后在列表中的排序,但是它们的速度更快。
  • ⼀个类具有多种“视⾓”:在Java中,⼀个类可以同时实现多个接⼝,例如,⼀个能够显⽰列表的窗⼝部件就可 能是⼀个同时实现了窗⼝和列表这两个接⼝的类。这反映的是多种ADT特性同时存在的特殊情况。
  • 允许不同信任度的实现:另⼀个多次实现⼀个接⼝的原因在于,你可以写⼀个简单但是⾮常可靠的实现,也 可以写⼀个很“炫”但是bug存在的⼏率(稳定性)⾼⼀些的实现。⽽使⽤者可以根据实际情况选择相应的⽅案。

枚举 

有时候⼀个ADT的值域是⼀个很⼩的有限集,例如:

⼀年中的⽉份: January, February, …

⼀周中的天数: Monday, Tuesday, …

⽅向: north, south, east, west

画线时的line caps : butt, round, square


这样的类型往往会被⽤来组成更复杂的类型(例如 DateTime 或者 Latitude ),或者作为⼀个改某个⽅法的⾏ 为的参数使⽤(例如 drawline )。当值域很⼩且有限时,将所有的值定义为被命名的常量是有意义的,这被称为枚举(enumeration)。

posted @ 2018-06-16 21:05  haochen1029  阅读(803)  评论(0编辑  收藏  举报