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.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...
随机推荐
- 【原创】有关Silverlight中“DataGrid中单元格动态绑定ComboBox单击时数据项莫名被清除 ”的解决方案及思路。
今天上班遇到一个很古怪的问题,搞了半天愣是没找到原因.是这样的,在Datagrid中有绑定一个ComboBox列,其不包含在 model数据中,而是单独在LoadingRow事件中去 从数据库拿数据绑 ...
- 设置Eclipse中的tab键为4个空格的完整方法
1.点击 window->preference-,依次选择 General->Editors->Text Editors,选中右侧的 insert space for tabs;如下 ...
- eclipse(adt-bundle)的Android SDK Manager下载不了谷歌的东西怎么办?
那就是换镜像! 腾讯镜像:android-mirror.bugly.qq.com 端口:8080 腾讯镜像使用方法:http://android-mirror.bugly.qq.com:8080/in ...
- 在Sql Server 中使用正则表达式
CREATE FUNCTION dbo.find_regular_expression ( ), --需要匹配的源字符串 ), --正则表达式 --是否区分大小写,默认为false ) RETURNS ...
- Django基础 - Debug设置为False后静态文件获取404
当设置setting.py文件当中的DEBUG=FALSE后,Django会默认使用Web Server的静态文件处理,故若没设置好Web Server对静态文件的处理的话,会出现访问静态文件404的 ...
- [MetaHook] Load DTX texture to OpenGL
This function load a LithTech *.dtx texture file and convert to OpenGL pixel format, compressed supp ...
- 通俗易懂------this指向
因为JavaScript 中this 是在运行期进行绑定的,因此JavaScript 中this 关键字具备多重含义. 具体在实际应用中,this的指向大致可以分为下面4种. 作为对象的方法调用 ...
- HoloLens开发手记 - Unity之Keyboard input 键盘输入
虽然HoloLens支持很多种输入方式,包括蓝牙键盘在内.但是大部分应用还是不能断定用户有物理键盘可以输入,所以虚拟键盘输入还是必须要提供的. Unity提供了一个TouchScreenKeyboar ...
- storm如何保证at least once语义?
背景 前期收到的问题: 1.在Topology中我们可以指定spout.bolt的并行度,在提交Topology时Storm如何将spout.bolt自动发布到每个服务器并且控制服务的CPU.磁盘等资 ...
- JS闭包文章--(翻译)Callbacks in Loops
原文地址:http://tobyho.com/2011/11/02/callbacks-in-loops/ 某些时候,你需要在循环里创建一个回调函数.我们来试试给页面里每个链接增加点击事件. var ...