文档章节

从头认识java-1.4 复用代码

raylee2015
 raylee2015
发布于 2015/10/21 08:10
字数 1138
阅读 8
收藏 0
点赞 0
评论 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)在业务层面:

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


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


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

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

目录


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

© 著作权归作者所有

共有 人打赏支持
raylee2015
粉丝 6
博文 265
码字总数 44224
作品 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

Xtend语言(1):独辟蹊径的JVM语言

我是2004年开始学习Java语言的,那时候的Java是1.4版本,说实在的,最新的Java10跟我一开始学习Java时候的语法变化并不大。我相信很多人都会跟我有相同的感受:Java写的越多就越觉得语法十分...

神思者l ⋅ 06/05 ⋅ 0

Java学习---Java简单认识

前言 小编在学习Java方面的基础知识,发现里面有很多是结合之前的语言的特点发展过来的,不同的地方是,Java有它自己的发展和特点。下面小编先简单地做一下总结,结合看过的1-2章的J2SE视频,...

m18633778874 ⋅ 04/01 ⋅ 0

Multi-Host Connections(三)

ReplicationDriver 针对Master/Slave,Mysql jdbc drivrer : ReplicationDriver https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-master-slave-replication-connection.html http......

墨子Zhai ⋅ 06/06 ⋅ 0

JVM学习之——Java内存区域

为了加深对Java语言的理解,加深对Java虚拟机工作机制、底层特性的了解和掌握,准备在闲暇时间,抽空对《深入理解Java虚拟机 JVM高级特性与最佳实践》一书进行学习。本文是学习此书第2章时的...

你想要怎样的未来 ⋅ 05/27 ⋅ 0

ThreadLocal源码分析

阅读原文请访问我的博客 BrightLoong's Blog 一. 简介 提醒篇幅较大需耐心。 简介来自ThreadLocal类注释 ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线...

BrightLoong ⋅ 05/28 ⋅ 0

Java 10 实战第 1 篇:局部变量类型推断

现在 Java 9 被遗弃了直接升级到了 Java 10,之前也发过 Java 10 新特性的文章,现在是开始实战 Java 10 的时候了。 今天要实战的是 Java 10 中最重要的特性:局部变量类型推断,大家都知道是...

Java技术栈 ⋅ 06/11 ⋅ 0

MyCAT SQL ON MongoDB

概述 可能你在看到这个标题会小小的吃惊,MyCAT 能使用 MongoDB 做数据节点。是的,没错,确实可以。 吼吼吼,让我们开启这段神奇的“旅途”。 本文主要分成四部分: 总体流程,让你有个整体...

wangchen1999 ⋅ 05/02 ⋅ 0

centos7 yum安装java运行环境,初识hadoop

安装java运行环境 1.实验机相关信息: [root@node2 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@node2 ~]# uname -r 3.10.0-327.el7.x86_6 2.配置epel源,以y......

smile68 ⋅ 04/21 ⋅ 0

学习大数据需要Java基础吗?

近几年,很多人都听到过一个名词“大数据”也有一部分人选择学习了解大数据,那么大数据到底是什么,学习大数据需要有Java基础吗? 推荐一个大数据学习交流群 119599574每天晚上20:10都有一节...

大数据大咖 ⋅ 06/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 42分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部