文档章节

从头认识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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如果彻底的卸载 visual-studio-code

C:\Users\Administrator\AppData\Roaming 我安装了visual-studio-code ,然后配置了 一堆东西。 现在我不需要了,我希望是 卸载 visual-studio-code ,然后来一个干净的visual-studio-code ...

之渊
11分钟前
0
0
[DOM] Found 2 elements with non-unique id

在同一个html文件中两个id都相同,所以才会出现上面问题。 参考路径: https://pdf-lib.org/Home/Details/5866

度_
28分钟前
0
0
Java 异常处理的误区和经验总结

前言 本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳。只有处理好了异常,才能提升开发人员的基本素养,提高系统的...

小致dad
34分钟前
0
0
dropWhile删除从第一个元素开始匹配,匹配失败则停止匹配

val set1=Set("a","b","c") val set2=Set("c","d","e") var set3=set1.drop(2) println(s"set3 drop first tow element : $set3") val set5=set1 drop 2 println(s"set1 ......

freeli
40分钟前
0
0
hive udf、udaf、udtf

1、UDF:用户定义(普通)函数,只对单行数值产生作用; 实现方法: 1. 继承UDF类 2. 重写evaluate方法 /** * @function 自定义UDF统计最小值 * @author John * */...

张欢19933
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部