Java经过十几年的发展,已经成为了企业级开发中炙手可热的技术。以至于越来越多的开发大军投入到Java EE的产品研发之中。虽然绝大多人人认为java学习掌握相比于C++来说简单很多,但殊不知这种简单的背后使得我们忽略了多少需要注意的细节,这对于很多应用来说也许会带来致命的缺陷,因为不好的命名规范,不高效的编程方式。本文力求讲解java应用中常忽略的一些问题,给出建议性处理方式,以期更好地应用java开发程序,不足之处,希不吝指教!
关于命名:
* 尽量使用完整的英文描述符
* 采用适用于相关领域的术语
* 采用大小写混合使名字可读
* 缩写要明智地使用,且在整个工程中统一 ,但尽量少用
* 避免使用长的名字,个人觉得小于 20 个字母为宜
* 避免使用下划线,但静态常量除外
* 常量的名字应该都使用大写字母,并且指出该常量完整含义
* 包(Package) 采用完整的英文描述符,应该都是由小写字母组成
* 类(Class) 采用完整的英文描述符,所有单词的第一个字母大写
* 接口(Interface)与类相同,习惯上使用形容词词缀able,ible,比如 Runnable, Comparable
(软件开发讲究团队合作,采用统一且合适的命名规范对于提高团队效率,提升代码的可读性和易维护性至关重要;在命名的时候我们一定要牢记两条原则:统一性和见名知意)
关于内存:
在使用java编程的时候,我们接触到的内存布局主要包括4种,即
*stack segment,基本数据类型以及对象引用
*heap segment,通过new关键字动态分配的对象
*code segment,程序代码
*data segment,一些常量,静态变量或对象等
程序中的局部变量存放在stack segment,这些局部变量是在具体方法执行结束之后,系统自动释放内存资源,而heap segment中的资源需要java垃圾回收机制来处理;
(另外实际上用到的可能还有寄存器,但这是不受程序员控制的,由编译环境优化控制,往往循环变量会被优化成寄存器类型,因为就速度而言寄存器>堆栈>堆>其他)
关于编码:
*在处理 String 的时候要尽量使用 StringBuffer 类,提高效率,减少内存耗用,具体请参照我的另一篇博文;
*尽量使用接口而不是一个具体的类,这样即使更改实现,外部类也不必做相应更改,体现了多态的意义;
*将类的属性按种类分块,将方法的实现按功能分块,适度使用对齐;
*尽可能不使用import java.util.*;的形式引入类,而是用到哪个类引入哪个,减少最后生成代码大小;
*尽量减少同名类,用包名体现类的层次,同时也便于框架管理,如:
com.metarnet.bean;
com.metarnet.service;
*用接口代替抽象类,不要同时使用overload和override,overload在编译时起作用,override在运行时起作用;
*函数调用时,通过形参传过来的对象必须先进行类型安全检验,避免使用异常;
*使用合适的设计模式,如单例模式,工厂模式;
*在循环的判断中不要直接使用方法调用的返回值,而要将方法的返回值赋给变量,然后再使用这个变量,避免重复运算;
*对于一组代码完成一个功能的代码,好把他们封装,放在一个新的方法里面,如果只是类内部使用, 声明为private;
*异常Exception的捕捉是会增加额外开销的。所以尽量避免过多的异常捕捉。越是经常调用的代码,越是要较少或者避免try…
catch..finally,如在for外捕获异常效率比每个循环开销小;
*用链式异常保留原始异常的信息e.printStackTrace的信息通过继承保留,便于跟踪程序调用层次;
*对于try块中如果可能抛出多个异常,后面要接多个catch块来捕获异常,并且注意顺序由细到粗;
*首善之举是重构(refactor)而不是复制(copy);
*避免使用NEW关键字来创建String对象;
*避免在同一行声明不同类型的多个变量,避免混乱;
*在每一行里写一条语句,清晰易读;
*避免把方法本地变量和参数定义成和类变量相同的名字,这样容易引起混扰,建议把任何的变量字都定义成唯一的。
(编码很多时候是件很具有艺术性的事情,如果我们保持良好的编程手法,不仅获得“艺术上的享受”,同时也赢得了程序的高效率及高可靠性。当你的代码被拿出来的时候,更像是一件艺术品的面世展览)