文档章节

从头认识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
江门
解决Unsupported major.minor version 51.0问题的感悟

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

刘梓航
2014/11/05
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
Java assert 关键字使用

关于Java assert关键字的使用,参考Stack Overflow的高票回答: What are some real life examples to understand the key role of assertions? Assertions (by way of the assert keyword) ......

Acce1erator
2017/10/18
0
0
JNA, Java Native开发利器

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

彭苏云
2013/04/16
0
4
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

没有更多内容

加载失败,请刷新页面

加载更多

Laravel UNION联合查询并分页

$xk = DB::table('xiaokes')->select(['id','xk_name as name','xk_teacher_id as tid','ke_type','created_at']) ->where('xk_teacher_id',$id); $query = DB::......

一只懒猫-
33分钟前
1
0
187 修改centos的密码

先登录

Lucky_Me
40分钟前
3
0
通过Timer类实现App 启动页停留三秒效果

Timer timer = new Timer(); //参数1:每次执行的任务代码 参数2:延时多少毫秒执行 参数3:任务间隔 单位:毫秒 timer.schedule(new TimerTask() { @Over...

lanyu96
46分钟前
0
0
pip更改下载源设置

任何一个信息都可以把人分为两类,知道的和不知道的。有些我们已知的信息,自己觉得很平常,却可能对另一些不知道的人来说很有用处。 比如今天要说的这个小技巧,我自己原以为不值一提,网上...

crossin
47分钟前
2
0
css预加载

css /* 预加载图片,挂在body上 */.preload-img:after{ content:""; background: url(../images/new/full_bg2.jpg) no-repeat -10000px -1000px;} js $(function(){ /......

红羊在厦门
54分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部