- 浏览: 52855 次
- 性别:
- 来自: 佛山
最新评论
文章列表
1.覆盖readObject()检查反序列化对象的有效性,以防止安全攻击。readObject()可视为一个隐藏的构造函数。在此方法里不要直接或间接的调用对象的可覆盖的方法(因为执行这些可覆盖的方法时,子类对象的状态可能还未初始化)
注:原书有说明如何使用序列化注入不安全的对象
2.对于对象控制,优先使用枚举类代替readResolve()方法。比如使用枚举实现单例模式
注:原书有说明如何使用序列化注入不安全的单例对象
3.考虑使用序列化代理设计模式(serialization proxy)实现对象序列化。此模式可以有效的避免通过序列化进行安全攻击等问题,缺点是轻微 ...
对象的序列化机制相当于提供了另一种方式创建对象。也可以理解为如果对象支持序列化,相当于对象声明了一个隐藏的构造函数。如果对象的类结构改变了,那么以前的序列化数据进行反序列化可能导致错误。
默认的序列化将写入对象的“物理内容”。包括对象本身,以及以此对象为根节点,所能访问的所有引用对象。使用默认序列化可能导致的问题有:
1.序列化数据与序列化对象内部引用的对象的API耦合在一起,如果引用对象的API改变,那么反序列化时可能出现错误
2.序列化引用对象将会消耗额外的空间(序列化数据)和时间(序列化过程)
3.在序列化过程中,可能导致内存溢出
因此建议使用自 ...
使用Maven发布项目
- 博客分类:
- Maven
本文介绍如何使用maven发布项目到SVN,进而对项目进行版本控制。本文相关概念参考自《Maven最佳实践:版本管理》
使用的开发环境如下(需要确定在命令行窗口里可以运行svn --version; mvn --version命令):
maven3.0.5
TortoiseSVN-1.8.1
安装时需要勾选安装svn命令行工具
SVN仓库(SvnRepo)
需自行配置
Maven仓库(MavenRepo)
使用SVN仓库搭建,具体过程可参考《使用SVN搭建Maven仓库》
具体步骤如下:
1.使用TortoiseSVN打开远程SvnR ...
11.74 谨慎的使用序列化
- 博客分类:
- Effective Java
Java的序列机制:
序列化
把JVM里的对象转换为字节数据,此数据可传输给其它应用程序或保存到固定存储(以IO流的方式)
反序列化
把对象序列化的字节数据转换为JVM里的对象
类或其继承的父类只要实现java.io.Serializable接口,其对象即可被序列化。此接口为标记接口,不包含任何方法。如果没有实现此接口,在序列化时会触发NotSerializableException
使用ObjectInput、ObjectOutput可以序列化对象,典型代码如下,需要注意的是输入/输出方法要互相对应:
//序列化对象
private void ...
9.65 不要忽略异常
- 博客分类:
- Effective Java
忽略异常指捕获异常对象后不进行任何处理,如下:
try{}
catch(SomeException e){
//未进行任何处理,异常被忽略 never do this
}
以上代码可能导致程序难以调试。在后续的运行中,程序可能在任何一个地方失败等问题。
如果确定此异常是可以被忽略的,那么至少应使用注释进行说明。建议输出一条日志信息
异常失败的原子性指如果调用对象的方法抛出了异常,那么此对象的状态应与抛出异常前相同。即对象状态不因为抛出异常而改变,只有这样,调用者才可能在捕获异常后进行恢复。
保证异常失败的原子性可能的方式包括:
1.执行运算前(这里指执行能够修改对象状态的运算)先检查条件,如检查输入参数值,对象属性。如果不满足条件则触发异常。
2.如果不能检查运算条件,那么应该执行可能触发异常的运算,再执行需要修改对象状态的运算
3.在异常触发后执行修复代码,适用于基于硬盘的数据操作,如文件和数据库
4.复制对象并对其进行运算,如果触发异常不会影响原对象。适用于复制对象不会明显降低性能 ...
异常类构造函数Throwable(String message)可以设置异常详细信息,详细信息里应包含所有引起此异常的方法,参数,属性等的说明。
自定义异常类可以定义引起异常的参数值替代直接设置String类型的异常信息,此方式使异常类更方便使用,如下:
public IllegalPeriodException(int start, int end){
//使用输入参数值拼接异常详细信息
super("start: "+start+" is bigger than end:"+end)
}
自定义checked e ...
基本原则:
1.使用@throws注释方法抛出的所有checked exception
2.使用throws声明方法可能抛出的所有checked exception
3.尽可能的使用@throws注释方法抛出的所有unchecked exception
4.不要使用throws声明方法可能抛出的unchecked exception
5.不要使用Exception,Throwable声明方法可能抛出的异常类型
6.如果类的所有方法可能抛出同一个异常,那么可以在类的注释里进行说明
9.61 合理的处理底层异常
- 博客分类:
- Effective Java
处理底层API抛出的异常包括3种方法:
1.上层API先检查输入参数,然后调用下层API以避免触发异常
2.上层API捕获下层API触发的异常后,使用日志进行记录。上层API不触发任何异常
3.上层API捕获下层API触发的异常后,封装为上层API的异常类对象抛出。此方式又称为异常传递链,如下:
try{
//....
}catch(LowerLevelException cause){
//下层异常对象作为引起上层异常的cause传递给上层异常对象
//可以调用异常对象的getCause()获取引起此异常的原因
throw new HigherLevel ...
9.60 优先重用标准异常类
- 博客分类:
- Effective Java
常用异常类包括:
IllegalArgumentException
输入参数值不合法
IllegalStateException
对象状态不适合调用当前方法,比如调用某个业务方法时对象还未正常初始化,此时应抛出此异常
NullPointerException
空指针异常
IndexOutOfBoundExcep ...
checked exception要求调用者必须使用try/catch进行捕获,否则编译时会提示错误。假如异常是不可恢复的,或者调用者捕获后只能进行如下处理,那么不要使用checked exception:
try{//...}
catch(TheCheckedException e){
throw new AssertionError();//无意义的处理
}
try{//....}
catch(TheCheckedException e){
e.printStackTrace();
System.exit(i);//无意义的处理
}
如果方法仅抛 ...
9.58 正确的使用异常
- 博客分类:
- Effective Java
Java的异常包括checked exception和unchecked exception,后者又包括runtime exception和error。使用基本原则包括:
1.如果异常是可恢复的,那么应使用checked exception。调用者必须使用try/catch捕获checked exception并处理(如果捕获那么编译时会提示错误)
2.如果异常是不可恢复的,那么应使用unchecked exception。其中runtime exception用于表示编程错误,error表示系统错误
3.自定义checked exception应继承Exception类, ...
如下代码错误的使用了异常判断,此种用法难以调试,并且JVM很难对其进行优化:
public void sayHello(String[] names){
int i=0;
try{
while(true)
System.out.println(names[i++]);//never do this
}catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
}
正确的用法是:
public void sayHello(String[] names){
...
字面上的命名约定:
包
1.使用域名反写
2.每部分不要超过8个字符
3.不要使用java,javax开头
com.bingo.hello
类型(类,接口,Annotation)
1.首字母大写
2.尽量不要使用缩写
HttpUrl(建议不要使用HTTPURL)
方法和属性
1.首字母小写
2.尽量不要使用缩写
3.JavaBean必须使用getter/setter
常量
全部大写
MIN_VALUE
局部变量
首字母小写
8.55 谨慎的进行性能优化
- 博客分类:
- Effective Java
基本原则包括:
1.努力写出好的程序而不是快的程序,不要为了性能而牺牲程序架构原则。好的程序应尽可能的遵守高内聚,低耦合(information hiding)原则。如果程序模块/层次分明,那么后期可以较轻松的进行性能优化
2.努力避免做出影响性能的设计决定。需要考虑的方面包括:与外部系统的交互,系统内部模块之间的交互,通讯协议,数据格式,API。
3.考虑API设计对性能优化的影响。如:频繁创建不可变类的对象可能影响性能,使用继承会增加耦合度进而影响后期修改。但是不要为了性能优化而使用反常的API,否则后期可能会导致灾难性结果
4.系统开发完成后进行性能测试。如果 ...