#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. scala学习之第三天:数组的特性与使用技巧

    1.数组 Scala数组与Scala序列是兼容的 - 在需要Seq[T]的地方可由Array[T]代替.最后,Scala数组支持所有的序列操作. 隐式转换 方法1:通过scala.collection ...

  2. IBatis.Net学习笔记七--日志处理

    IBatis.Net中提供了方便的日志处理,可以输出sql语句等调试信息. 常用的有两种:1.输出到控制台:   <configSections>    <sectionGroup  ...

  3. 管窥MVVMLight Command参数绑定和事件传递

    前言 由于在实际项目中,业务功能的增加导致软件开发规模在逐渐变大,所以我准备找个Silverlight框架来组织当前项目中的文件,以期能够让后续的业务功能增添和维护更加容易一些.无意中,我在这篇文章中 ...

  4. Matlab的title如何实现换行显示?

    怎么才能在'B Range'前面开始换行呢? title(['abc','L Range:',num2str(a),'(nm)','~~',num2str(b),'(cm)','B Range:',n ...

  5. Visual Studio 2015官方汇总包括下载和视频

     7月20日 23:30 Visual Studio 2015正式版正式发布,作为微软新一代开发利器,在全地球乃至全宇宙乃至全太阳系中最强大 且没有之一的IDE(上述描述来自微博用户评论)跨平台支持成 ...

  6. 用一个下午从零开始搭建一个基础lbs查询服务

    背景 现在做一个sns如果没有附近的功能,那就是残缺的.网上也有很多现成的lbs服务,封装的很完整了. 我首先用了下百度lbs云,但是有点不适合自己的需要,因此考虑用mongodb建一个简单的lbs服 ...

  7. 自己保留:data provider

    <system.data>    <DbProviderFactories >      <add name="MySQL Data Provider" ...

  8. [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 分析: 经典的平衡树题,我用Treap做的 下面有几点注意的: 1.可能出现新加入的人的 ...

  9. ThinkPHP之视图模版的使用

    用户发起一个请求后,服务器应该返回一个页面,而页面是由我们的视图层来控制的. 一.修改控制器 <?php namespace Home\Controller; use Think\Control ...

  10. AngularJS开发指南8:AngularJS模块的详解

    在讲angularjs的模块之前,我们先介绍一下angular的一些知识点: AngularJS是纯客户端技术,完全用Javascript编写的.它使用的是网页开发的常规技术(HTML,CSS,Jav ...