EffectiveJava(18)接口优先于抽象类
***接口和抽象类同样可以用来定义多个实现的类型,然而,接口通常是最佳途径.***
这条规则有个例外 – 当演变的容易性比灵活性和功能性更为重要的时候,应该用抽象来定义类型
,但前提是必须理解并且可以接受这些局限性.
接口
1.现在的类可以很容易被更新,以实现新的接口
2.接口式定义mixin的理想选择
3.接口允许我们构造非层次结构的类型框架
public interface ISinger {
AudioClip sing(Song song);
}
public interface ISongWriter {
Song compose(boolean hit);//构成 冲击
}
定义一个接口同时实现ISinger和ISongWriter
public interface ISingerSongWriter extends ISinger,ISongWriter{
AudioClip strum();//音频剪辑弹奏
void actSensitive();//行为敏感
}
抽象类
1.如果使用抽象类定义类型,那么必须使用继承的手段来增加功能
2.演变的容易性比灵活性和功能性更为重要的时候,应该用抽象来定义类型
3.抽象类的演变比接口的演变容易得多
通过对导出的每个重要接口都提供一个抽象的骨架实现类,把接口和抽象类的优点结合起来
接口的作用仍然是定义类型,但是骨架实现类接管了所有域接口实现相关的工作
骨架实现–
static List<Integer> intArrayAsList(final int[] a){
if(a == null)
throw new NullPointerException();
return new AbstractList<Integer>() {
public Integer get(int i){
//自动装箱
return a[i];
}
public Integer set(int i,int val){
int oldval = a[i];
//自动拆箱
a[i] = val;
自动装箱
return oldval;
}
public int size(){
return a.length;
}
};
}
骨架为抽象类提供了实现上的帮助,但又不强加抽象类被用作类型定义时所特有的严格限制
模拟多重继承:实现了接口的类可以把对于接口的方法调用,转发到一个内部私有类的实例上,这个内部私有类扩展了股价实现类
编写骨架方法必须确定哪些方法是最基本的,其他的方法可以根据他们来实现.这些基本的方法将成为股价实现类中的抽象方法,
然后必须为接口中所有其他的方法提供具体的实现.
–例如Map.Entry接口的骨架实现类
public abstract AbstractMapEntry<K,V> implements Map.Entry<K,V> {
public abstract K getKey();
public abstract V getValue();
@Override
public V setValue(V value) {
// TODO Auto-generated method stub
return (V) new UnsupportedOperationException();
}
@Override
public boolean equals(Object o){
if(o==this)
return true;
if(!(o instanceof Map.Entry))
return false;
Map.Entry<K, V> arg = (Entry<K, V>) o;
return equals(getKey(),arg.getKey())&&
equals(getValue(),arg.getValue());
}
private boolean equals(Object o1,Object o2){
return o1 == null? o2 == null: o1.equals(o2);
}
@Override
public int hashCode(){
return hashCode(getKey())^hashCode(getValue());
}
private int hashCode(Object o){
return o == null?0:o.hashCode();
}
}
EffectiveJava(18)接口优先于抽象类的更多相关文章
- day 25-1 接口类、抽象类、多态
# 接口类:python 原生不支持# 抽象类:python 原生支持的 接口类 首先我们来看一个支付接口的简单例子 from abc import abstractmethod,ABCMeta #我 ...
- day25:接口类和抽象类
1,接口类和抽象类知识背景:一开始在程序界是没有这些概念的,后来就流行了一种语言叫做JAVA,JAVA是一种典型的纯面向对象的语言,JAVA写的程序都是非常适用于更庞大的项目,很多程序员就总结出了一些 ...
- 我对面向对象设计的理解——Java接口和Java抽象类
在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...
- Python——接口类、抽象类
建立一个接口类.抽象类的规范 from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): # 元类 默认的元类 t ...
- jdk1.8.0_45源码解读——Set接口和AbstractSet抽象类的实现
jdk1.8.0_45源码解读——Set接口和AbstractSet抽象类的实现 一. Set架构 如上图: (01) Set 是继承于Collection的接口.它是一个不允许有重复元素的集合.(0 ...
- jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现
jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现 一. Map架构 如上图:(01) Map 是映射接口,Map中存储的内容是键值对(key-value).(02) A ...
- python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装
一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...
- Python面向对象之接口类(抽象类)
Python面向对象之接口类(抽象类):就是制定一个规范. 比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方 ...
- Java接口和Java抽象类的认识
在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...
随机推荐
- 《c程序设计语言》读书笔记-3.6-数字转字符串最小宽度限制
#include <io.h> #include <stdio.h> #include <string.h> #include <stdlib.h> # ...
- Command Pattern的简单介绍
Command pattern 的角色有:Command(抽象命令).ConcreteCommand(具体命令) .Invoker(传达命令者) .receiver(接收命令者)Client(客户类, ...
- Windows域同步检查repadmin
C:\Users\>repadmin /show replUsage: repadmin <cmd> <args> [/u:{domain\user}] [/pw:{pa ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- 经典js框架
http://requirejs.org/ http://durandaljs.com/ http://knockoutjs.com/index.html http://www.jeasyui.com ...
- [ CodeVS冲杯之路 ] P3116
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3116/ 基础的高精度加法,注意一下两个数长短不一和答案第一位的处理即可,当然也可以用压位的方法做 #include&l ...
- Linux Mint---安装docky
这个安装的时候没啥难度,直接在软件中心安装一下就可以了,效果很赞的,linux下最棒的dock, 简洁大方,效果好! 只不有过一点需要注意,这个东东直接很上拖是添加不上去的 需要从/usr/share ...
- 转载:GCC 提供的原子操作
转载自:GCC 提供的原子操作 GCC 提供的原子操作 gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作. 其声明如下: type __sync_f ...
- OpenGL入门学习(五)
http://developer.178.com/201103/94955548786.html 今天要讲的是三维变换的内容,课程比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果,我只好在最后 ...
- mogilefsdBUG mogilefsd[15624]: crash log: Modification of a read-only value attempted at /usr/local/share/perl5/Sys/Syscall.pm line 227
mogilefsd[15624]: crash log: Modification of a read-only value attempted at /usr/local/share/perl5/S ...