EffectiveJava(20)使用子类型化优化标签类
- 标签类:其中有许多样板代码,包括枚举声明,标签域和条件语句
- 如果要给它添加风格,除了有权限修改源码之外,你还得给每个条件语句都添加一个条件,否则就会在运行时失败
- 标签类过于冗长,容易出错,并且效率低下
- 我们可以用类层次类代替标签类 – 子类型化
public class Figure {
enum Shape{RECTANGLE,CIRCLE};
final Shape shape;
double width;
double length;
double radius;
Figure(Double radius){
shape = Shape.CIRCLE;
this.radius = radius;
}
Figure(double width,double length){
shape = Shape.RECTANGLE;
this.width = width;
this.length = length;
}
double area(){
switch(shape){
case RECTANGLE:
return width*length;
case CIRCLE:
return Math.PI*(radius*radius);
default:
return 0;
}
}
}
如何将一个标签类优化为类层次 – 子类型化
1.为标签类中的每个方法都定义一个包含抽象方法的抽象类,这些方法的行为都依赖于标签值
2.为每种原始标签类都定义根类的具体子类
Figure类对应的类层次
/**
* 子类型化:定义能表示多种风格对象的单个数据类型,标签类是对其的一种效仿
*/
public abstract class Figure {
abstract double area();
}
public class Circle extends Figure {
final double radius;
Circle(double radius) {
this.radius = radius;
}
@Override
double area() {
return Math.PI * (radius * radius);
}
}
public class Rectangle extends Figure {
final double length;
final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
double area() {
return length * width;
}
}
最后扩展:类层次可以用来反映类型之间本质上的层次关系,有助于灵活性,并且进行更好的编译检查
如:正方形本质上也是一种矩形,在类中如何反应?
public class Square extends Rectangle {
// Square(double length, double width) {
// super(length, width);
// // TODO Auto-generated constructor stub
// }
Square(double side) {
super(side, side);
}
}
总结:标签类很少有适用的时候.当你想要编写一个包含显示标签域的类时,应该考虑一下,这个标签是否可以被取消,这个类是否可以用类层次来代替.当你遇到一个包含标签域的现有类时,就要考虑它重构到一个层次结构中去.
EffectiveJava(20)使用子类型化优化标签类的更多相关文章
- EffectiveJava——类层次优于标签类
标签类: 有时候,可能会遇到带有两种甚至更多钟风格的类的实例的类,并包含表示实例风格的(tag)域.例如下面这个类,它能够表示圆形或者矩形: /** * 类层次优先与标签类 * @author wei ...
- Effective Java 第三版——23. 优先使用类层次而不是标签类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- user模式下编译android 代码被proguard优化导致类和变量丢失
在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了.所以,在JNI应用中该慎用progurad啊. 解决办法: 1.在An ...
- JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用
1.标签 以类似于html标签的方式实现的java代码的封装. 第一:形成了开发标签的技术标准---自定义标签的技术标准. 第二:java标准标签库(sun之前自己开发的一系列的标签的集合)jstl, ...
- HTML&CSS基础-子元素的伪类选择器
HTML&CSS基础-子元素的伪类选择器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html的源代码 <!DOCTYPE html> <html& ...
- Cocos2d-x 3.0标签类Label
Cocos2d-x 3.0后推出了新的标签类Label,这种标签通过使用FreeType[1]来使它在不同的平台上有相同的视觉效果.由于使用更快的缓存代理,它的渲染也将更加快速.Label提供了描边和 ...
- firefox快捷键窗口和标签类
firefox快捷键窗口和标签类: 关闭标签: Ctrl+W 或 Ctrl+F4关闭窗口: Ctrl+Shift+W 或 Alt+F4向左移动标签: Ctrl+左方向键 或 Ctrl+上方向键向右移动 ...
- 前端1-----CSS层叠样式表了解,css的引入方式,三大选择器(标签,类,id),高级选择器
前端1-----CSS层叠样式表了解,css的引入方式,三大选择器(标签,类,id),高级选择器 一丶CSS简介 叠样式表(英文全称:Cascading Style Sheets)是一种用来表现 ...
- jeecms各种标签类(大部分,并没有包含一些其他的如text_cut html_cut之类)
软件包 comjeecms.cms.action.directive 类摘要 ChannelDirective 栏目对象标签 ChannelListDirective 栏目列表标签 ChannelPa ...
随机推荐
- POJ2175:Evacuation Plan(消负圈)
Evacuation Plan Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 5665Accepted: 1481Special J ...
- 7月9日day1总结
今天的学习过程和小结 上午学习了前端包括html,CSS,js等基本内容 前端10.25.134.187 html js css 1.块元素 ---默认占满整行,如果设置了高度和宽度都有效,如果不设置 ...
- .prm详解
一.内存分配 1.资源分布 如上图所示,单片机型号最后的数字也就代表了单片机中Flash的大小,S12G128 表示Flash有128K Byte,S12G192 表示Flash有192K Byte. ...
- 蓝牙HC-05与HC-06对比指令集
高电平->AT命令响应工作状态 低电平->蓝牙常规工作状态 <重新上电表示完成复位> HC-05 可以主从切换模式,但是HC-06虽然可以做主机也可以做从机,但是不能切 ...
- linux启动流程梳理【转】
接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下 ...
- [ CodeVS冲杯之路 ] P1842
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1501/ 一开始看到题目有点懵逼,没有看懂题目的意思QuQ 后面发现,原来就是个类似于斐波拉契数列的递推 f[0]=5 ...
- 【Cocos2D研究院之游戏开发】
http://www.xuanyusong.com/archives/category/ios/cocos2d_game 分类目录归档:[Cocos2D研究院之游戏开发] 201211-19 Co ...
- mininet命令
官方文档:http://mininet.org/walkthrough/ 翻译的官方文档:https://segmentfault.com/a/1190000000669218 ovs-ofctl相关 ...
- App接口加密解密方法
//加密 function encrypt($data) { $key = md5("safregr"); $str = base64_encode($data); $res = ...
- ORA-01940: cannot drop a user that is currently connected
https://www.cnblogs.com/lwlxqlccc/p/8694696.html