Effective Java之最佳建议
#Effective Java之最佳建议
此书中,目前给我帮助最大的两条建议是: - 检查参数的有效性
- 不要忽略异常
###检查参数的有效性
对于这一条,使我感同身受的原因是:在Web项目中,前期经验不足,前台进行数据验证后,后端Java代码就没有进行任何验证就开始直接使用数据。这导致的后果当然是惨重的,其中细小的部分非常容易出bug。特别是设计到金钱交易的项目,闸门没有守好,则污水横流、危害系统。
所以当我看到这一条时,非常有感触。然而使我更加理解并决定坚决遵循这条规则的动力也在于作者一句定睛之语: 只要有效性检查有一次失败,你所付出的努力就可以连本带利得到偿还了
###不要忽略异常
这条建议非常重要,奈何许多人都视而不见、常常违反。
一部分Java程序使用起来非常烦人,原因在于他出抛出大量的受检异常,try-catch块破坏了代码的美观和简洁。因此,省事儿的人在catch中习惯的一句写法就是:
```java
e.printStackTrace();
```
这样的写法直接就忽略了异常,在下面的代码中,他们继续书写豪情,丝毫没有羞涩之感。
其实受检异常的存在,本身就表明情况是处于可恢复状态的,直接忽略他们是在不妥。但话说回来,如果对每个受检异常都进行特殊处理,那我们的工作量可就大了,如同插秧,对每个坏苗进行守护是不现实的,好的做法是直接剔除坏苗。
但程序和插秧还是有些区别的,在剔除坏苗的同时,你要让人知道哪里出了问题,否则错误的程序继续运行,如同危桥上的货车,迟早要出事儿。
一个好的解决方案是把受检异常变为运行时异常。
```java
public static RuntimeException unchecked(Exception e) {
if (e instanceof RuntimeException) {
return (RuntimeException) e;
} else {
return new RuntimeException(e);
}
}
```
但这样对于原有的程序简洁性还是没有什么提升,try-catch块还是如此碍眼。拿Java反射来说,几乎处处都是受检异常(简单起见,没有对受检异常进行处理):
```java
Class cl = City.class;
City city = null;
try {
city = cl.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Method method = null;
try {
method = cl.getMethod("getName", null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
Object obj = method.invoke(city, null);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
```
使用起来,确实让人头大。当然,我们可以放在一个try-catch块中指定,不过也不美观。
我想到的解决方法是对常用的反射方法进行封装,去除掉这些异常:
```java
public static T getInstance(Class cl) {
try {
return cl.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
throw new RuntimeException();
} public static Method getMethod(Class<?> cl, String methodName,Class<?>... parameterTypes) {
try {
return cl.getMethod(methodName, parameterTypes);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
throw new RuntimeException();
} public static Object invoke(Method method, Object obj,Object... args) {
try {
return method.invoke(obj, args);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
throw new RuntimeException();
}
```
这样在使用的时候,可以直接调用这些工具方法即可。
Effective中还有很多具有建设性的意见,就不一一列举了,感兴趣的人可买一本书来参考。
Effective Java之最佳建议的更多相关文章
- Java异常(二) 《Effective Java》中关于异常处理的几条建议
概要 本章是从<Effective Java>摘录整理出来的关于异常处理的几条建议.内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误 ...
- effective java 第2章-创建和销毁对象 读书笔记
背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优 ...
- Effective Java 第三版——28. 列表优于数组
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——42.lambda表达式优于匿名类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——44. 优先使用标准的函数式接口
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——46. 优先考虑流中无副作用的函数
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——47. 优先使用Collection而不是Stream来作为方法的返回类型
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——48. 谨慎使用流并行
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 和我一起学Effective Java之创建和销毁对象
前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...
随机推荐
- Kinect for Windows SDK开发初体验(一)环境配置
1.开发环境需求 (1).硬件需求 a.需要拥有双核,2.66GHz以上的CPU. b.显卡支持Microsoft DirectX 9.0c; c.2GB的内存 d.Kinect for Window ...
- JQuery 中 is(':visible') 解析及用法
实例 选择 <body> 元素中每个可见的元素: $("body :visible") 亲自试一试 定义和用法 :visible 选择器选取每个当前是可见的元素. 除以 ...
- [转]World Wind Java开发之四——搭建本地WMS服务器
在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...
- nginx添加镜像缓存 proxy_store(未完待续)
简介:nginx proxy_store缓存的结果,就是按照服务器的目录设置,直接缓存文件到同样的目录,像镜像一样. 遇到的问题:当服务器需要缓存的文件过大,恰巧此时没有缓存,但是有很多用户同时访问此 ...
- 如何清洗 Git Repo 代码仓库
git prune 如何清洗 Git Repo 代码仓库 在腾讯云上创建您的SQL Cluster>>> » 相信不少团队的代码仓库 Git Repo 变得越来越大. ...
- 解决vs2013使用Git推送到远程仓库报错的问题
在上一篇<让PowerShell使用Git>中可以让PowerShell运行Git命令,那么就开始使用. 1.从远程仓库克隆项目 GitHub和Git.oschina都是不错的免费托管网站 ...
- ios 消息推送流程 转载
iOS开发:推送通知简述及开发实践热度 1已有 706 次阅读 2013-10-15 09:23 |个人分类:经验之谈|系统分类:ios| IOS, 推送一.关于推送通知 推送通知,也被叫做远程通知, ...
- Jenkins进阶系列之——06FTP publisher plugin插件下载(支持绝对路径)
注意:绝对路径用/开头 绝对路径:/root/.jenkins/jobs/test/workspace/bbb/test.war 相对路径:bbb/test.war 点我下载
- [AHOI2013]打地鼠(网络流)
[问题描述] 游戏里一共会冒出来N个地鼠,这些地鼠冒出来的位置都分布在一条直线上.第i个地鼠会在Ti时刻在Xi位置冒出来,打到第i个地鼠的得分是Pi. 当游戏开始时(也就是0时刻) ...
- WCF 入门(15)
前言 度过了一个阳光明媚的周末. 一个阴霾的周日夜晚. 第15集 WCF里面的异常处理(1) Exception handling in WCF 大致看了一下,这个WCF视频里面总共有6集,这个是第 ...