您的位置:首页 > 编程语言 > Java开发

收集整理的一些java编程良好习惯

2009-12-11 15:30 330 查看
1、  JVM 管理两种类型的内存:堆内存(heap),栈内存(stack),堆内在主要用来存储程序在运行时创建或实例化的对象与变量。而栈内存则是用来存储程序代码中声明为静态(static)(或非静态)的方法。
2、  JVM 中对象的生命周期,创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶段,释放阶段。
3、  避免在循环体中创建对象,即使该对象点用内存空间不大。
for(int i=0;i<10000;++i){
Object obj = new Object();
System.out.println("obj="+obj);
}
应改成:
Object obj = null;
for(int i=0;i<10000;++i){
obj = new Object();
System.out.println("obj="+obj);
}
4、  软引用的主要特点是具有较强的引用功能。只有当内存不够的时候,才回收这类内存,因此在内存足够的时候,它们通常不被回收。它可以用于实现一些常用资源的缓存,实现Cache 的功能。
A a = new A();
SoftReference sr = new SoftReference(a);
a = null;
if(sr !=null){
a = sr.get();
}else{
a = new A();
sr = new SoftReference(a);
}
5、  弱引用对象与Soft 引用对象最大不同就在于:GC 在进行回收时,需要通过算法检查是否回收Soft 引用对象,而对于Weak 引用对象,GC 总是进行回收。
A a = new A();
WeakReference wr = new WeakReference(a);
a = null;
if(sr !=null){
a = wr.get();
}else{
a = new A();
wr = new WeakReference(a);
}
6、  共享静态变量存储空间。
7、  有时候我们为了提高系统性能,避免重复耗时的操作,希望能够重用一些创建完成的对象,利用对象池实现.类似JDBC 连接池。
8、  瞬间值,序列化对象大变量时,如果此大变量又没有用途,则使用transient 声明,不序列化此变量,同时网络传输中也不传输。
9、  不要提前创建对象。
void f(){
int i;
A a = new A();
if(....){
a.showMessage();
}
}
改成:
void f(){
int i;
A a = null;
if(....){
//用到时才实例化
a = new A();
a.showMessage();
}
}
10、            优化建议:
(1) 最基本的建议就是尽早释放无用对象的引用。
A a = new A();
a = null; //当使用对象a之后主动将其设置为空。
(2) 尽量少用finalize函数。
(3) 如果需要使用经常用到的图片展,可以使用软引用。
(4) 注意集合数据类型,包括数组,树等数据,这些数据结构对GC 来说,回收更为复杂。
(5) 尽量避免在类的默认构造器中创建,初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费。
(6) 尽量避免强制系统做垃圾内存回收。
(7) 尽量避免显式申请数组空间。
(8) 尽量在合适的场景下使用对象池技术以提高系统性能,缩减系统内存开销。
11、            当做数组拷贝操作时,采用System.arraycopy()方法完成拷贝操作要比采用循环的办法完成数组拷贝操作效率高
12、            尽量避免在循环体中调用方法,因为方法调用是比较昂贵的。
13、            尽量避免在循环体中使用try-catch 块,最好在循环体外使用try--catch 块以提高系统性能。
14、            在多重循环中,如果有可能,尽量将最长的循环放在最内层,最短的循环放在最外层,以减少循环层间的变换次数。
15、            在需要线程安全的情况下,使用List list = Collections.synchronizedList(new ArrayList());
16、            如果预知长度,就设置ArrayList 的长度。
17、            ArrayList 与 LinkedList 选择,熟悉底层的实现原理,选择适当的容器。
18、            在使用字串的拼接的时候,用StringBuffer代替String。
19、            系统I/O优化,采用缓冲和压缩技术,优化性能。
20、            避免在类在构造器的初始化其他类。
21、            尽量避免在构造中对静态变量做赋值操作。
22、            不要在类的构造器中创建类的实例。
23、            组合优化继承。
24、            最好通过Class.forname() 动态的装载类。
25、            JSP 优化,采用out 对象中的print 方法代替println()方法。
26、            采用ServletOutputStream对象代替JSPWriter 对象。
27、            采用适当的值初始化out 对象缓冲区的大小。
28、            尽量采用forward()方法重定向新的JSP。
29、            利用线程池技术处理客户请求。
30、            Servlet 优化
(1) 通过init()方法来缓存一些静态数据以提高应用性能。
(2) 用print() 方法取代println()方法。
(3) 用ServletOutputStream 取代 PrintWrite。
(4) 尽量缩小同步代码数量。
31、            改善Servlet 应用性能的方法
(1) 不要使用SingleThreadModel。
(2) 使用线程池ThreadPool。
32、            EJB 优化
(1) 实体EJB 中常用数据缓存与释放。
(2) 采用延迟加载的方式装载关联数据。
(3) 尽可能地应用CMP 类型实体EJB。
(4) 直接采用JDBC技术处理大型数据。
33、            优化JDBC连接
(1) 设置合适的预取行值。
(2) 采用连接池技术。
(3) 全合理应用事务。
(4) 选择合适的事务隔离层与及时关闭连接对象。
34、            PreparedStatemetn只编译解析一次,而Statement每次都编译解析。在进行数据库操作的时候用PreparedStatement代替Statement,可以避免因为引用过多而引起的错误。
35、            尽可能地做批处理更新。
36、            通过采用合适的getXXX 方法提高系统性能。尽量将POJO的get/set方法设为public。
37、            采用设计模式。
38、            使用Integer.valueOf()代替new Integer();
39、            使用"const".eqauls(variable)代替 variable.eqauls("const") 避免null point exception。
40、            在进行复杂查询语句的拼接的时候,建议加上"where 1=1",当然在不考虑数据库的性能时。
41、            try{
…}catch(Exception e){
…}finally{
if(conn!=null){
conn.colse();
conn==null
}
}
在使用数据库操作的时候尽量多用finally语句,进行资源的释放。
42、            在进行多异常捕获的时候,最后建议加上Exception异常做没有考虑到的异常捕获,比如:
try{
…}catch(OtherException e){
…}catch(Exception e){
…} finally{
…}
}
43、            给每个if(condition){}都加上大括号,即使里面只有一句话,加强程序的可读性。
44、            能用常量的东西都要用常量来完成,避免使用硬编码,增加可维护性质。比如少用 String str = "123",使用
private static final CONST = "123" ;
String str = CONST;
45、            方法名开头用小写,类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写,并且所有的名字命名要体现出业务的特性。
对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:
ThisIsAClassName
thisIsMethodOrFieldName
若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。
Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。
46、            多看看Apache下的一些Utils包吧,方便实用,必备工具!
47、            可以用for(int i= 100;i>0;i--;)去代替for(int i = 0;i <100;i++),这样可以提高程序的运行速度。
48、            写注释有助于写出逻辑清晰的代码。
49、            用字符分隔多字符串时,为了防止字符串中有设定的分隔符,采用如下字符进行分隔(c#的,JAVA也差不多)。
char char2 = '/x0012';
string strreg = ""; 
strreg += char2;
50、            一个数据有很多属性时,可以用反射取出所有属性,在制作HTML表单时,这个方法非常爽。
51、            在表单取值的时候,多使用String A = B.trim();来去空格。
52、            把某非String类型转换成String类型的,大多用.toString(); 但也可以用String.valueof(...);
53、            内部类爱好者 + 匿名内部类狂热分子。任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作。
54、            为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素的定义:
equals()
hashCode()
toString()
clone()(implement Cloneable)
implement Serializable
55、            当编写 synchronized 块时,有几个简单的准则可以遵循,这些准则在避免死锁和性能危险的风险方面大有帮助:
(1) 使代码块保持简短。Synchronized 块应该简短 -- 在保证相关数据操作的完整性的同时,尽量简短。把不随线程变化的预处理和后处理移出 synchronized 块。
(2) 不要阻塞。不要在 synchronized 块或方法中调用可能引起阻塞的方法,如 InputStream.read()。
(3) 在持有锁的时候,不要对其它对象调用方法。这听起来可能有些极端,但它消除了最常见的死锁源头。
56、            对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。
57、            应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。
58、            设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。
59、            使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议:
(1) 一个复杂的开关语句:考虑采用“多形”机制。
(2) 数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现。
(3) 许多成员变量在特征上有很大的差别:考虑使用几个类。
60、            让一切东西都尽可能地“私有”--private。可使库的某一部分“公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素--只有private字段才能在非同步使用的情况下受到保护。
61、            谨惕“巨大对象综合症”。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。
62、            若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。
63、            尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。
64、            避免使用“魔术数字”,这些数字很难与代码很好地配合。如以后需要修改它,无疑会成为一场噩梦,因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”。所以,应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。
65、            涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何异常--如果它造成了那个对象的创建失败。这样一来,调用者就不会以为那个对象已正确地创建,从而盲目地继续。
66、            当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表明自己的用途。除此以外,可在类内放置一个boolean标记,指出对象是否已被清除。在类的finalize()方法里,请确定对象已被清除,并已丢弃了从RuntimeException继承的一个类(如果还没有的话),从而指出一个编程错误。在采取象这样的方案之前,请确定finalize()能够在自己的系统中工作(可能需要调用System.runFinalizersOnExit(true),从而确保这一行为)。
67、            在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。
68、            若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必要)。在对finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要基础类组件的时候它们依然有效。
69、            创建大小固定的对象集合时,请将它们传输至一个数组(若准备从一个方法里返回这个集合,更应如此操作)。这样一来,我们就可享受到数组在编译期进行类型检查的好处。此外,为使用它们,数组的接收者也许并不需要将对象“造型”到数组里。
70、            尽量使用interfaces,不要使用abstract类。若已知某样东西准备成为一个基础类,那么第一个选择应是将其变成一个interface(接口)。只有在不得不使用方法定义或者成员变量的时候,才需要将其变成一个abstract(抽象)类。接口主要描述了客户希望做什么事情,而一个类则致力于(或允许)具体的实施细节。
71、            在构建器内部,只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法,因为那些方法可能被其他人覆盖或取消,从而在构建过程中产生不可预知的结果。
72、            对象不应只是简单地容纳一些数据;它们的行为也应得到良好的定义。
73、            在现成类的基础上创建新类时,请首先选择“新建”或“创作”。只有自己的设计要求必须继承时,才应考虑这方面的问题。若在本来允许新建的场合使用了继承,则整个设计会变得没有必要地复杂。
74、            用继承及方法覆盖来表示行为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色,这是绝对应该避免的:应直接使用一个“颜色”字段。
75、            为避免编程时遇到麻烦,请保证在自己类路径指到的任何地方,每个名字都仅对应一个类。否则,编译器可能先找到同名的另一个类,并报告出错消息。若怀疑自己碰到了类路径问题,请试试在类路径的每一个起点,搜索一下同名的.class文件。
76、            在Java 1.1 AWT中使用事件“适配器”时,特别容易碰到一个陷阱。若覆盖了某个适配器方法,同时拼写方法没有特别讲究,最后的结果就是新添加一个方法,而不是覆盖现成方法。然而,由于这样做是完全合法的,所以不会从编译器或运行期系统获得任何出错提示--只不过代码的工作就变得不正常了。
77、            用合理的设计方案消除“伪功能”。也就是说,假若只需要创建类的一个对象,就不要提前限制自己使用应用程序,并加上一条“只生成其中一个”注释。请考虑将其封装成一个“独生子”的形式。若在主程序里有大量散乱的代码,用于创建自己的对象,请考虑采纳一种创造性的方案,将些代码封装起来。
78、            警惕“分析瘫痪”。请记住,无论如何都要提前了解整个项目的状况,再去考察其中的细节。由于把握了全局,可快速认识自己未知的一些因素,防止在考察细节的时候陷入“死逻辑”中。
79、            警惕“过早优化”。首先让它运行起来,再考虑变得更快--但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候,才应进行优化。除非用专门的工具分析瓶颈,否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解,而且难于维护。
80、            请记住,阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己,还是对后来的人,它们都是相当重要的。如对此仍有怀疑,那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折,这样或许能将你说服。
81、            如认为自己已进行了良好的分析、设计或者实施,那么请稍微更换一下思维角度。试试邀请一些外来人士--并不一定是专家,但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的工作,看看是否能找出你一度熟视无睹的问题。采取这种方式,往往能在最适合修改的阶段找出一些关键性的问题,避免产品发行后再解决问题而造成的金钱及精力方面的损失。
82、            良好的设计能带来最大的回报。坚持抵制草草完工的诱惑--那样做往往得不偿失!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息