从头认识java-1.4 复用代码
来源:互联网 发布:桌面windows手机版 编辑:程序博客网 时间:2024/05/16 16:07
这一章节我们来讨论一下复用代码。
1.为什么?
这一点我也不详细展开了,随便说说都可以说出几个理由。
笔者总结了一下:
对于老板:降低成本,缩短开发时间,追求利润最大化
对于teamleader:加快进度,压缩工期,最短时间交付最多项目
对于程序猿:不用加班
2.怎么做?
笔者分成四个方面来描述:
1)在方法层面:
例如:我们平常在很多地方都需要时间这个东西,但是我们就可能复制粘贴下面的代码
Calendar calendar = Calendar.getInstance();int thisMonth = calendar.get(Calendar.MONTH)+1;
搞到代码里面各处都是获取时间,这个时候其实我们可以抽取些代码,形成时间类
/** * 处理日期时间工具类 * @author ray */public class DateUtil {/** * @return 获得当前Calendar */public static Calendar getCalendar(){Calendar calendar = Calendar.getInstance();return calendar;}/** * @return 获得今年 */public static int getThisYear(){return getCalendar().get(Calendar.YEAR);}/** * @return 获得本月 */public static int getThisMonth(){return getCalendar().get(Calendar. MONTH)+1;}/** * @return 获得当前时间 */public static Date getNow(){return getCalendar().getDate();}}
又例如:在系统里面我们需要处理servlet传回来的数据
double amount = Double.valueOf(req.getParameter(“amount”)).doubleValue();int count = Integer.valueOf(req.getParameter(“count”)).intValue();String name = new String(req.getParameter(“name”).getBytes(),"GBK");Date now = DateUtil.getDate(req.getParameter(“now”),"yyyy-MM-dd");
我们可以抽象成一个转换器的类
/** * 默认的读取器,读取POST提交的数据 * @author raylee */public class Converter {private HttpServletRequest req = null;/* * 转换器 * @param HttpServletRequest */public Converter(HttpServletRequest req) throws IOException {this.req = req;}/* * @param 名称 * @return the data of Object */public Object getData(String name) throws IOException {Object data = req.getParameter(name);if (data==null) {throw new IOException("转换器失败");}return data;}/* * @param 名称 * @return 返回double */public double getDouble(String name) throws IOException {return Double.valueOf(getString(name)).doubleValue();}/* * @param 名称 * @return 返回整数 */public int getInteger(String name) throws IOException {return Integer.valueOf(getString(name)).intValue();}/* * @param 名称 * @return 返回字符串 */public String getString(String name) throws IOException {return getData(name).toString();}/* * @param 名称 * @return 返回GBK编码 */public String getChinese(String name) throws IOException {return new String(getString(name).getBytes(),"GBK");}}
2)在类层面:
(1)聚合
我们看下面的例子:
package com.ray.ch01;public class Bird {private String name;public String getName() {return name;}public void setName(String name) {if (name != null) {this.name = name;} else {System.out.println("名称不能为空");}}}
先建立一个Bird这一个类。
然后jack和rose同时养了一只小鸟
package com.ray.ch01;public class Jack {private Bird bird;public Bird getBird() {return bird;}public void setBird(Bird bird) {this.bird = bird;}}
package com.ray.ch01;public class Rose {private Bird bird;public Bird getBird() {return bird;}public void setBird(Bird bird) {this.bird = bird;}}
聚合,其实就是has-a关系,上面也是代码复用之一,两者复用了Bird这个类。
(2)继承
我们看下面的两个类
歌唱家:
package com.ray.ch01;public class Singer {private long id;private String name;private String sex;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "id:" + getId() + ";name:" + getName() + ";sex:" + getSex();}public void sing() {}}
拳击手:
package com.ray.ch01;public class Boxer {private long id;private String name;private String sex;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "id:" + getId() + ";name:" + getName() + ";sex:" + getSex();}public void fight() {}}
从上面的两个类可以看出,大家的代码几乎一样,这个时候我们可以抽象出一个人Person的类来,然后让singer和boxer来继承他
这里涉及的继承概念我们下一章节将详细展开。
package com.ray.ch01;public class Person {private long id;private String name;private String sex;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "id:" + getId() + ";name:" + getName() + ";sex:" + getSex();}}
我们将共性的代码放到里面,然后其他两个实现类将实现各自独有的代码即可。
package com.ray.ch01;public class Boxer extends Person {public void fight() {}}
package com.ray.ch01;public class Singer extends Person {public void sing() {}}
继承:is-a关系,代码复用的重要手段。
3)在配置层面:
例如我们平常使用框架,一般都有配置文件,我们可以把这些配置文件集中管理,然后重复使用
4)在业务层面:
例如,现在企业内部存在多系统情况,但是一般来说每个系统都需要有登陆模块,我们可以把这个登陆模块单独抽取出来,变成构件,这样就可以重复使用。
总结:这一章节主要讨论了如何复用代码。
这一章节就到这里,谢谢。
-----------------------------------
目录
10 1
- 从头认识java-1.4 复用代码
- 从头认识java-目录
- 从头认识Spring-1.11 注入List或Set(这个例子比较体现代码复用)
- 从头认识java-1.6 多态
- 从头认识java-4.4 this
- 从头认识java-7.2 接口
- 从头认识java-9.7 LinkedList
- 从头认识java-9.9 set
- 从头认识java-9.10 Map
- 从头认识java-9.11 Queue
- 从头认识java-17.1 多线程
- 从头认识java-1.2 对象-服务提供者
- 从头认识java-1.3 隐藏具体实现
- 从头认识java-1.5 继承(1)
- 从头认识java-1.5 继承(2)
- 从头认识java-2.1 操作符
- 从头认识java-2.2 算术操作符
- 从头认识java-2.4 逻辑运算符
- 软件性能计时
- 黑马程序员 ——ios基础 ——函数
- JavaWeb中文乱码问题
- 用ajax获取数据return的结果为undefined
- Android性能专项测试之battery-historian试用
- 从头认识java-1.4 复用代码
- ibatis插入数据到MySQL
- apache kafka监控系列-KafkaOffsetMonitor
- Android Studio代码着色插件
- 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
- ArcGIS使用字段计算器python脚本整理三规合一图斑
- codeforces 376C Divisible by Seven(能被7整除的数)
- Ubuntu 下修改文件拥有者
- 黑马程序员 ——ios基础 ——#include文件搜索顺序、数组