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语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...
随机推荐
- 1257 背包问题 V3——分数规划
N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大. Input 第1 ...
- [bzoj3158]千钧一发——二分图+网络流
题目 传送门 题解 很容易建立模型,如果两个点不能匹配,那么连一条边,那么问题就转化为了求一个图上的最大点权独立集. 而我们可以知道: 最大点权独立集+最小点权覆盖集=总权值. 同时最小点权覆盖在一般 ...
- matlab fft demo
clf; fs=32;N=1024; %采样频率和数据点数 n=0:N-1; t=n/fs; %时间序列 x=1*sin(t); %信号 y=fft(x,N); %对信号进行快速Four ...
- 【原创】Linux环境下的图形系统和AMD R600显卡编程(8)——AMD显卡DRM驱动初始化过程
前面几个blog对DRM驱动.显卡的显存管理机制.中断机制都进行了一些描述,现在阅读AMD drm驱动的初始化过程应该会轻松许多. 下面是一AMD的开发人员编写的文章(先暂时放在这里,后续有时间再添加 ...
- Sqlite 约束条件 Constraints
一.约束 Constraints 我们在数据库中存储数据的时候,有一些数据有明显的约束条件. 比如一所学校关于教师的数据表,其中的字段列可能有如下约束: 年龄 - 至少大于20岁.如果你想录入一个小于 ...
- 多线程之:ThreadLocal
Java中ThreadLocal类可以使创建的变量只被同一个线程进行读和写操作,即使有多个线程同时执行同一段代码,并且这段代码中又有一个指向同一个ThreadLocal变量的引用,这些线程依然不能看到 ...
- Python的并发并行[4] -> 并发[1] -> concurrent.future 模块
concurrent.future 模块 1 thread模块 / thread Module 1.1 常量 / Constants Pass 1.2 函数 / Function Pass 1.3 类 ...
- 大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配
第十一章 数据结构(下)-集合操作11.1 集合元素的映射-map11.1.1 map 映射函数的操作11.1.2 高阶函数基本使用案例1+案例211.1.3 使用 map 映射函数来解决11.1.4 ...
- Count Numbers with Unique Digits -- LeetCode
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10^n. Exam ...
- POJ 2686 Traveling by Stagecoach(状压DP)
[题目链接] http://poj.org/problem?id=2686 [题目大意] 给出一张无向图,你有n张马车票每张车票可以租用ti匹马, 用一张马车票从一个城市到另一个城市所用的时间为这两个 ...