EffecJava Method
坚持使用Overrider注解,可以预防我们并没有重载的情况出现。
除非使用者绝对安全,不然使用保护性拷贝,可以使程序安全。
public class Period {//没有拷贝安全
private final Date start;
private final Date end; public Period(Date start, Date end) {
if (start.compareTo(end) > 0) {
throw new IllegalArgumentException("开始时间比结束时间晚");
} this.start = start;
this.end = end; } public Date getStart() {
return this.start;
} public Date getEnd() {
return this.end;
}
} public class PeriodProtect {
private final Date start;
private final Date end; public PeriodProtect(Date start, Date end) {//使用了保护性拷贝,保证安全
this.start = new Date(start.getTime());
this.end = new Date(end.getTime()); if (this.start.compareTo(this.end) > 0) {//先拷贝后检查,是因为防止一个叫TOCTOU的一种漏洞攻击。
throw new IllegalArgumentException("开始时间比结束时间晚");
}
} public Date getStart() {
return this.start;
} public Date getEnd() {
return this.end;
}
} public class Test { public static void main(String[] args) {
Date start = new Date();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Date end = new Date(); Period p = new Period(start, end);
PeriodProtect pro = new PeriodProtect(start, end); end.setYear(88); Date d = p.getEnd();
Date dp = pro.getEnd(); System.out.println(d);//输出 Sat Aug 20 21:04:56 CDT 1988 ,没有保护性拷贝,会根据修改end的参数被修改period里面的值,比较不安全。
System.out.println(dp);//会正确输出Sat Aug 20 21:04:56 CDT 2018,使用了拷贝安全之后就能够保证不会被篡改。
}
}
重载(Overload)和覆盖(Overrider)
public class CollectionClassfier {//测试重载Overloded,在Overloading的时候是编译时选择,所以会是选择collection
public static String classfier(List<?> list) {
return "list";
} public static String classfier(Set<?> set) {
return "set";
} public static String classfier(Collection<?> col) {
return "collection";
} public static void main(String[] args) {
Collection<?>[] col = { new ArrayList<String>(), new HashMap<String, String>().values(),
new HashSet<String>() }; for (Collection<?> c : col) {
System.out.println(classfier(c));
}
/* 输出
collection
collection
collection
*/
} } //////////////////////////////////////////测试覆盖////////////////////////////////// public class Wine {
String name() {
return "Wine";
}
} public class BWine extends Wine{
@Override
String name(){
return "BWine";
}
} public class CWine extends BWine {
@Override
String name() {
return "CWine";
}
} public class TestForOverride {//测试覆盖 public static void main(String[] args) {
Wine[] wine = {new Wine(),new BWine(),new CWine()};
for(Wine w:wine){
System.out.println(w.name());
}
}
}
/*输出
* Wine
BWine
CWine * */
会发现在第一个例子里面,使用的是重载,而重载是在编译时就选择好方法,在for循环中使用了Collection<?> c,所以之后执行的方法也是在选择重载的Collection,
而在覆盖中Wine w:wine,即使我们传入的是Wine,因为覆盖是在程序运行时确定,所以,可以正确识别我们需要执行的方法。
一个关于List 重载的小陷阱
public class SetList { public static void main(String[] args) {
Set<Integer> set = new TreeSet<Integer>();
List<Integer> list = new ArrayList<Integer>();
for (int i = -3; i < 3; i++) {
set.add(i);
list.add(i);
}
for (int i = 0; i < 3; i++) {
set.remove(i);//这里是renmove object
list.remove(i);//这里是remove index
}
System.out.println(list + " " + set); }
/*
*
* 输出
* [-2, 0, 2] [-3, -2, -1]
*
*
* */
}
我们想要在数组[-3,-2,-1,0,1,2]中剔除[0,1,2]这三个数值,然而set成功了list却失败了。原因是因为,在java引入了自动封装后,我们可以在set里面直接传入 int类型数值,java会自动封装成Integer类型,而list却不会,因为list的remove有两种,一种是remove(object o),一种是 remove(int index),我们传入的是int,他会执行的是remove(int index),第一次执行remove(0),剔除-3 变成[-2,-1,0,1,2],第二次remove(1),变成[-2,0,1,2],第三次remove(2)变成[-2, 0, 2] ,如果想要remove对应对象,要把int变成Integer。
EffecJava Method的更多相关文章
- jsp中出现onclick函数提示Cannot return from outside a function or method
在使用Myeclipse10部署完项目后,原先不出错的项目,会有红色的叉叉,JSP页面会提示onclick函数错误 Cannot return from outside a function or m ...
- Apply Newton Method to Find Extrema in OPEN CASCADE
Apply Newton Method to Find Extrema in OPEN CASCADE eryar@163.com Abstract. In calculus, Newton’s me ...
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)
今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...
- HTTP Method详细解读(`GET` `HEAD` `POST` `OPTIONS` `PUT` `DELETE` `TRACE` `CONNECT`)
前言 HTTP Method的历史: HTTP 0.9 这个版本只有GET方法 HTTP 1.0 这个版本有GET HEAD POST这三个方法 HTTP 1.1 这个版本是当前版本,包含GET HE ...
- IIS7.5上的REST服务的Put,Delete操作发生HTTP Error 405.0 - Method Not Allowed 解决方法
WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...
- The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory 这是由于项目里面的一些 ...
- Spring boot: Request method 'DELETE' not supported, Request method 'PUT' not supported, Request method 'POST' not supported
GET,POST,PUT,DELETE, Spring都支持,不要怀疑Spring, 一定是前端发送的rest 请求和后端的响应不匹配, 查找原因以及解决办法, 很简单 用chrome打开F12控制台 ...
- 异常:java.lang.LinkageError: loader constraint violation: when resolving interface method
异常:java.lang.LinkageError: loader constraint violation: when resolving interface method "javax. ...
- HTTP Method 之 Post VS. Get
引言 WebAPI 现在非常火的轻量服务框架,因其使用得使用了Http协议,并且具备了可协商内容(生成不同内容格式)等优势,所以在互联网业务中被广泛使用. 那作为HTTP最常用的两个方法Get和Pos ...
随机推荐
- android -------- ConstraintLayout介绍 (一)
ConstraintLayout 翻译为 约束布局,也有人把它称作 增强型的相对布局,由 2016 年 Google I/O 推出. 扁平式的布局方式,无任何嵌套,减少布局的层级,优化渲染性能.从支持 ...
- P4426 [HNOI/AHOI2018]毒瘤
挺不错的一个题. 题意即为求一个图的独立集方案数. 如果原图是一棵树,可以直接大力f[x][0/1]来dp. 由于非树边很少,考虑2^11容斥,强制某些点必选,然后再O(n)dp,这样应该过不了. 发 ...
- FBI树(第一次做建树题)
试题来源 NOIP2004 普及组 问题描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它的结 ...
- Web测试——功能测试
由于本人工作接触Web测试,所以我从网上找的资料,学习了解web测试哪些内容,然后自己整理汇总的随笔,如文章中有不足的地方,请大家多多指教:或者文章内容与他人相似,望见谅. 功能测试: 1.链接测试: ...
- bzoj3675
题解:首先要明确一件事,就是当分割的方案固定时,无论先分割的哪一段,结果都是不变的,然后能列出dp方程:\(dp[i][j]=max(dp[k][j-1]+(a[i]-a[k])*(a[n]-a[i] ...
- GitHub学习三-远程版本库更新与提交
1.远程版本库更新 一般来说,将本地与远程相关联之后,首先将数据从远程更新下来再上传比较好. 输入 git pull origin master 如果新建版本库的话勾选了初始化包含readme.md, ...
- POJ - 题解sol[暂停更新]
初期:一.基本算法: (1)枚举. (poj1753,poj2965) poj1753 话说我用高斯消元过了这题... poj2965 巧了,用高斯消元01矩阵更快(l o l). (2)贪心(poj ...
- 二十三、Spring框架的相关知识点总结
1.Spring的优点: 1.1.Spring在大小和透明性方面是轻量级的,Spring框架大约只有2MB大小. 1.2.控制反转(IOC):使用控制反转技术实现了低耦合,依赖注入(DI)到对象,而不 ...
- 使用maven构建一个web项目
使用maven构建一个web项目 首先建立一个maven项目(关于环境配置上节有详细过程): 1)-->右键new,-->project ...
- 如何把一个杯子卖到上万元,不学你就OUT了
我们可以看看一个产品卖到多少钱需要占有什么样的资源: 第1种卖法:卖产品本身的使用价值,只能卖3元/个 如果你将他仅仅当一只普通的杯子,放在普通的商店,用普通的销售方法,也许它最多只能卖3元钱,还可能 ...