文档章节

从头认识java-1.4 复用代码

raylee2015
 raylee2015
发布于 2015/10/21 08:10
字数 1138
阅读 8
收藏 0

这一章节我们来讨论一下复用代码。

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;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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)在业务层面:

例如,现在企业内部存在多系统情况,但是一般来说每个系统都需要有登陆模块,我们可以把这个登陆模块单独抽取出来,变成构件,这样就可以重复使用。


总结:这一章节主要讨论了如何复用代码。


这一章节就到这里,谢谢。

-----------------------------------

目录


版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/49154375

共有 人打赏支持
raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
私信 提问
maven版本与jdk版本 对应关系

Release Date Version Required Java Version 2017/10/24 3.5.2 Java 7 2017/4/7 3.5.0 Java 7 2017/3/24 3.5.0-beta-1 Java 7 2017/2/28 3.5.0-alpha-1 Java 7 2015/11/14 3.3.9 Java 7 201......

晨猫
02/07
0
0
Java 5 、6、 7中新特性

JDK5新特性(与1.4相比)【转】 1 循环 for (type variable : array){ body} for (type variable : arrayList){body} 而1.4必须是: for (int i = 0; i < array.length; i++){ type variabl......

thinkyoung
2014/10/14
0
0
Cannot make a static reference to the non-stati...

今天碰到这样一些错误,Eclipse提示Cannot make a static reference to the non-static type T。代码如下: public class DAOFactory<D extends TemplateDAO<B>, B> {private static Map<Str......

开源中国驻成都办事处
2013/05/30
0
0
JNA, Java Native开发利器

下面的文章由转载而来,java与c++的调用基本思路是这样子,但是结合我的使用经验,在使用jna和jnative的时候需要考虑到jdk的版本,jnative跟jdk1.4的结合可能会有点问题,因为我之前选的是j...

彭苏云
2013/04/16
0
4
解决Unsupported major.minor version 51.0问题的感悟

今天偶然间同事遇到一个问题,也加深了自己对eclipse中build path和java compiler compliance level的理解。 问题是这样的,同事在eclipse中开发的项目,导成jar之后,放到服务器上,总是报“...

刘梓航
2014/11/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

对接比特币钱包的PHP开发包

BtcTool是一个基于第三方服务和离线裸交易实现的PHP比特币应用开发包,适合不希望部署本地 节点旳PHP开发者,开发包主要包含以下特性: 利用第三方服务获取指定地址的utxo集合 离线生成消费裸...

汇智网教程
3分钟前
0
0
【自用】 VHD to VHDX

VHDX: 在VHD 2TB 的基础上提供 64TB的容量。 支持逻辑扇区大小为 4KB,和每块的大小为 256MB,来优化虚拟磁盘性能。 比VHD提供更高的安全性、可靠性和性能。 convert-VHD –path d:\Hyper-v...

Tensor丨思悟
16分钟前
0
0
30 岁转行做Python开发晚吗?而且是零基础

最近有小伙伴问小编,30 岁转行做Python开发晚吗? 小编想说,其实无论男女,只要想学,有这个动力,就直接去行动。无论年龄,无论性别,只要你想一直勇往直前,那么想做的就去做吧~这里有一...

糖宝lsh
26分钟前
7
0
详解Spring中的Profile

前言 由于在项目中使用Maven打包部署的时候,经常由于配置参数过多(比如Nginx服务器的信息、ZooKeeper的信息、数据库连接、Redis服务器地址等),导致实际现网的配置参数与测试服务器参数混淆...

watermelon11
41分钟前
4
0
phper必知必会(二)

  1.说说你对进程,线程以及协程的理解      进程:是系统进行资源分配和调度的基本单位,是基本操作系统结构的基础。进程是程序基本执行的实体。进程与进程之间是独立的,拥有完全独立...

SEOwhywhy
57分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部