#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之最佳建议的更多相关文章

  1. Java异常(二) 《Effective Java》中关于异常处理的几条建议

    概要 本章是从<Effective Java>摘录整理出来的关于异常处理的几条建议.内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误 ...

  2. effective java 第2章-创建和销毁对象 读书笔记

    背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优 ...

  3. Effective Java 第三版——28. 列表优于数组

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  4. Effective Java 第三版——42.lambda表达式优于匿名类

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  5. Effective Java 第三版——44. 优先使用标准的函数式接口

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  6. Effective Java 第三版——46. 优先考虑流中无副作用的函数

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. Effective Java 第三版——47. 优先使用Collection而不是Stream来作为方法的返回类型

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. Effective Java 第三版——48. 谨慎使用流并行

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. 和我一起学Effective Java之创建和销毁对象

    前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...

随机推荐

  1. Http请求中POST与GET的区别——前端面试

    一.原理区别 Http定义了与服务器交互的方法,其中最基本的四种是:GET,POST,PUT,DELETE,正对应着对资源的查,改,增,删.URL的全称是资源描述符,我们可以这样认为,一个URL地址, ...

  2. 【转】【MMX】 基于MMX指令集的程序设计简介

    (一) MMX技术简介 Intel 公司的MMX™(多媒体增强指令集)技术可以大大提高应用程序对二维三维图形和图象的处理能力.Intel MMX技术可用于对大量数据和复杂数组进行的复杂处理,使用MMX ...

  3. U3D临时文件GICache巨大

    C:\Users\asus\AppData\LocalLow\Unity\Caches\GiCache 看名字似乎是全局光的缓存,可以通过Edit - Preference - GI Cache,选中 ...

  4. Qt——树的搜索

    一.Qt中的树 Qt中树的实现有两种方式.第一种是使用Qt提供的QTreeWidget,很多函数都封装好,比较方便:另一种是通过QTreeView实现,设置它的数据模型,比如使用QStandardIt ...

  5. [CareerCup] 5.6 Swap Odd and Even Bits 交换奇偶位

    5.6 Write a program to swap odd and even bits in an integer with as few instructions as possible (e. ...

  6. web.xml配置文件

    一.web.xml里面的标签 <display-name> <context-param> <listener> <filter> 和 <filt ...

  7. 如何下载struts 2及其各个包的作用

    一.http://archive.apache.org/dist/struts/library/ 二. struts官网: http://struts.apache.org/ 进入主页后点击" ...

  8. UITableView和UICollectionView的Cell高度的几种设置方式

    UITableViewCell 1.UITableView的Cell高度默认由rowHeight属性指定一个低优先级的隐式约束 2.XIB中可向UITableViewCell的contentView添 ...

  9. XP明年就被停止技术支持,这会带来什么?谈谈如何做决策

    XP是MS的一款老牌操作系统,相信大家都不陌生,甚至还有继续使用的人,当然了,在虚拟机里用它也是很好用的,不过,再漂亮的姑娘,也有嫁人的时候,作为XP的父母,MS微软明年四月将停止支持有十多年历史的 ...

  10. [BZOJ2038]小Z的袜子(莫队算法)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 分析:莫队算法 莫队算法是一种思想…… 处理问题:不带修改的区间询问 使用要求:[l-1 ...