java编码规范

右括号”) ”与其后面的关键字之间,关键字与其后面的左括号”(”或”{”之间,以及”}”与”{”之间,要以一个空格隔开;除”.
”外,所有二元操作符的前、后要加空格;在逗号后边加一个空格。

说明:

一个紧跟着括号的关键词应该被空格分开;

空白应该位于参数列表中逗号的后面;

所有的二元运算符,除了“.”,应该使用空格将之与操作数分开。一元操作符和操作数之间不应该加空格,比如:负号(“-”),自增(“++”)和自减(“--”);

for语句中的表达式应该被空格分开;

强制转型后应该跟一个空格。

空格不应该置于方法名与其左括号之间,这将有助于区分关键字和方法调用;

示例:

for (int i = 0; i <= 10; i++) {

...

}

double xNorm = y > 0.0 ? (x / y) : x;

一个Java文件代码不宜太长,一般建议500行以内(不包括注释),客户端GUI相关Java文件可以稍长,但超过2000行的程序难以阅读,应该尽量避免。

1.考虑将代表基础数据类型的类声明为final的。

说明:以提高调用效率。

带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指
定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联
(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。

2. 定义小型的类和方法。

说明:要尽量减少类中的方法数,在能够满足需要的情况下避免再增加多余的方法。一个方法只实现一个功能,不要设计多用途、面面俱到的方法。对于过大的类或方法,要考虑将其重构到更多的类或方法中。

3. 所有的成员都应该是私有的,通过对象方法来访问。

说明:以保证只有成员所属的类才能对它们作变更,从而使对象间的耦合性最小,程序易于维护。

4. 利用多态性来取代”instanceof”。

说明:用”instanceof”来判断对象类型的代码,必须随着可选对象类型的变化而改变,这样的代码是不稳定、不易于维护的。因此要使用多态,避免使用”instanceof”。

5. 用等效的方法替换重复的语句。

说明:代码应该只写一次。对于拷贝粘贴生成的重复代码,必须将其重构到一个方法或类中,来消除它们。

将一般操作重构为一个方法或类,使代码更易于理解和维护,同时可减少测试的工作量。

6. 在控制流结构中使用块语句(即用{}括起来),而不要用表达式语句。当控制流中只有一个语句,并有助于提高可读性时,可将整个控制语句放在一行中。

说明:以减少相邻控制结构造成的代码不明确。

  1. 用括号明确表达式的运算顺序,即对较复杂的计算或条件判断,尽量多在适当处增加括号以避免歧义。

  2. 少用语义难懂的语句,如:iNum = iLen + iPos++ ;  ”++” , ”--”
    等操作最好不与其他语句合在一起写,以增加代码可读性,如果必须使用请加括号。

  3. 三元条件运算符” ? :”的条件如果是表达式,则条件表达式要用圆括号括起来。

  4. 在switch语句的最后一个case分支中要加上break语句。

  5. 用equals(),而不是”==”,来判断对象是否相等。

注意:当name为null时,”Bob”.equals(name)不会抛出异常,因此不建议使用name.equals(”Bob”)。

7. 不要悄无声息地吸收运行时异常,catch中要有相应的处理。

说明:如数组越界等,会为debug带来了困难,至少应打印出栈信息,报告异常。

8. 后台模块的调试打印语句,一定要设置开关。可采用命令行输入条件、配置文件设置条件等方式。

9. 用finally块释放资源。

说明:如I/O流、数据库连接等。

10. 避免同步。

说明:只在确实有必要时使用同步。不要同步提供基础数据类型或数据结构的类。

11. 如果方法中有不需要同步的重要操作,不要同步整个方法。

说明:通常只有方法中的少量操作需要同步,在这种情况下,方法级的同步就过粗了。应用同步的块语句来替代方法级的同步。

12. 在读写实例变量时避免不必要的同步。

说明:对原子数据(对象引用、除long和double外的所有原始数据类型)的读或写是原子操作,不需要同步。但如果原子变量与其他变量相关,则有必要同步。

12. 考虑用notify()取代notifyAll()。

说明:notify()的效率更高。当多个线程等待不止一个条件,或者多个线程要对一个信号量作出响应时,才使用notifyAll()。

13. 使用懒惰初始化。

说明:即在声明时并不创建对象,以免编译不需要的对象,从而提高程序效率。但要注意的是对于局部变量,尽量在声明局部变量的同时进行初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。

14. 避免创建不必要的对象。

说明:这一点对不太使用或生命周期短的对象尤其重要。创建和回收不必要的对象会浪费运行时间。

举例:

A a = new A();

if(1 == i) {

list.add(a);

}

应该改为

if(1 == i) {

A a = new A();

list.add(a);

}

15. 重新初始化和重用对象,避免创建新的对象。

说明:用存取方法,而不是构造器,来重新初始化对象。

要注意,选用的实现应无需创建对象来管理保存对象。可使用工厂实现封装对对象的保存和重用。

16. 对公共方法、接口的优化要慎重。

说明:对代码的优化不应影响到公共的方法和接口,要保证公共方法和接口的稳定,除非确定有必要对它们进行优化。

17.
import时尽量引用实际的类名,不要用”*”号。可以使用Eclipse快捷键(默认为Ctrl+Shift+O)自动导入所需的类、除去多余的导入。

18. 尽量在合适的场合使用单例。

说明:使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:

1)        控制资源的使用,通过线程同步来控制资源的并发访问;

2)        控制实例的产生,以达到节约资源的目的;

3)       
控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。

19. 尽量避免随意使用静态变量。

说明:当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存。

举例:

public class A{

static B b = new B();

}

此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。

20. 注意静态方法,静态类,静态成员变量的使用。

错误的做法:

Public class A {

Private Static xxxType B;

Public static void functionA() {

………;

B.XXXXX;

}

}

类中有一个静态成员变量,方法functionA中需要使用该变量,则functionA必须是静态方法。这样,需要new一个classA,,调用classA.functionA,会由于多个类的实例在内存驻留,导致出现各种问题。

正确的两种写法:

1)  将类定义为静态类,直接调用classA.functionA

2) 
将方法定义为非静态方法,成员变量定义为非静态变量,每次new一个classA,需要长期持有的变量可通过构造函数传入(但是不能作为类内部的成员保存下来)。

  1. 尽量使用局部变量。

说明:调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量等,都在堆(Heap)中创建,速度较慢。

  1. 尽量减少对变量的重复计算。

举例:

for(int i = 0; i < list.size(); i++)

应该改为

for(int i = 0, len = list.size(); i < len; i++)

并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

  1. 尽量使用基本数据类型代替对象。

  2. 单线程应尽量使用HashMap, ArrayList。

说明:HashTable,Vector等使用了同步机制,降低了性能。

  1. 尽量合理的创建HashMap等容器。

说明:当要创建一个比较大的hashMap时,充分利用另一个构造函数

public HashMap(int initialCapacity, float loadFactor)


免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是0.75,需要多大的容量,最好能准确的估计所需要的最佳大小,同样的Hashtable、Vector也是一样的道理。

  1. 尽量使用移位来代替‘a/b‘的操作,尽量使用移位来代替‘a*b‘的操作。

说明:"/"和"*"都是代价很高的操作,使用移位的操作将会更快和更有效。

  1. 尽量使用StringBuilder和StringBuffer进行字符串连接。

  2. 尽量确定StringBuffer的容量。

说明:StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,可以在创建StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。

  1. 尽量早释放无用对象的引用。

说明:大部分时候,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部、引用变量显式设为null。但如果方法内需要执行耗时、耗内存的操作,就有必要将对象赋值为null,可以尽早的释放对对象的引用。

  1. 尽量避免使用二维数组。

说明:二维数据占用的内存空间比一维数组多得多,大概10倍以上。

  1. 尽量避免使用split。

说明:除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。

  1. ArrayList和LinkedList的使用

说明:一个是线性表,一个是链表,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指针;添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据。

  1. 尽量使用System.arraycopy()代替通过来循环复制数组。

  2. 尽量缓存经常使用的对象。

  3. 尽量避免非常大的内存分配。

  4. 尽量不要使用finalize方法。

说明:实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。

  1. 选择合适的字符集。

说明:String的以下两个方法会产生字符集的问题,如下:

new String(bytes)

getBytes()

正确的做法:

调用这两个方法时,会使用JVM默认字符集,因此不同的操作系统下会返回不同的结果,因此必须对在使用String以上两个方法的地方逐一修改,使用以下两个方法:

new String(bytes , NAME_OF_CHARSET)

getBytes( NAME_OF_CHARSET)

其中,NAME_OF_CHARSET表示字符集编码方式。实例:

//  根据默认编码获取字节数组

byte[] bytes=new byte[0];

try {

bytes =
str.getBytes("GB18030");

} catch (UnsupportedEncodingException e)
{

// TODO
Auto-generated catch block

logger.error(e);

}

关于选用何种字符集?需要根据需求确定,比如需要解析的数据(MIB节点)只支持英文,可选用”ISO-8859-1”。

  1. 注意数据库相关资源的释放。

错误的写法:

Connection conn =
DBConnectionManager.getConnection();  // (1)

try{

String sql = "xxxx";

PreparedStatement pt =
conn.prepareStatement(sql);  // (2)

ResultSet rs = pt.executeQuery(sql);  //
(3)

while(rs.next()) {

xxxxx;

}

rs.close();  // (4)

pt.close();  // (5)

} catch(Exception e) {

logger.error(e);

} finally {

try {

conn.close();

} catch (Exception e) {

logger.error(e);

}

}

注意以上标记有数字的注释部分,在try子句内抛异常时有可能引起rs和pt/st没有关闭。因此建议把声明和初始化分开,把声明提到try子句外面去,在finally子句里面用:

DBConnectionManager.getInstance().free(conn,pt,rs)

来确保全部都能够关闭。(free方法在释放资源前有对null的校验,不用担心抛空指针)。

正确的书写方式如下:

Connection conn =
DBConnectionManager.getConnection();  // (1)

PreparedStatement pt = null;  // (2)

ResultSet rs = null;  // (3)

try{

if(conn != null) {

String sql =
"xxxx";

pt =
conn.prepareStatement(sql);  // (4)

rs =
pt.executeQuery(sql);  // (5)

while(rs.next())
{

xxxxx;

}

}

} catch(Exception e) {

logger.error(e);

} finally {

DBConnectionManager.getInstance().free(conn,
pt, rs);  // (6)

}

  1. 避免用一个对象访问一个类的静态变量和方法,应该用类名替代。

  2. 避免在一个语句中给多个变量赋相同的值。它很难读懂。例如:

举例:

fooBar.fChar = barFoo.lchar = ‘c’;

这种写法是不推荐的。

  1. 设法让程序结构符合目的。

举例:

if (booleanException) {

return true;

else {

return false;

}

应该代之以如下方法:

return booleanException;

类似地:

if (condition) {

return x;

}

return y;

应该写为:

return (condition ? x : y);

java编码规范,码迷,mamicode.com

时间: 2024-10-02 19:04:25

java编码规范的相关文章

阿里Java编码规范

详细,全面 很不错 阿里 Java编码规范

个人整理--Java编码规范

编码规范对于开发人员来说是非常重要的,有以下几个原因: 1.一个软件的生命周期中,80%的花费在于维护 2.几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 3.编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码 4.如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品 5.为来自不同的项目组或个人提供标准的代码格式. 6.增加易读性. 在不用Java两年多后因工作需要我又要转入Java开发,为此我整理出下面的编码规范,

Java 编码规范

参考Sun公司的Java编码规范,半翻译半理解. 使用空行分割代码块,并给代码块添加注释: 一个文件一个类(或者接口),将私有类放在引用该类的公用类的后面: 源文件构成:文件注释.package/import.类或接口的声明: /* * Class name * Version info * Copyright notice * Program description */ 使用4个空格作为缩进,避免使用Tab键(Tab键还没有统一的标准,有的是4个空格,有的是8个空格): 控制每行代码的长度,

java编码规范及优化总结

一.java概述 1991 年Sun公司的James Gosling(詹姆斯·高斯林)等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器.1994年将Oak语言更名为Java. 二.Java的三种技术架构 J2EE:Java PlatformEnterprise Edition,开发企业环境下的应用程序,主要针对web程序开发: J2SE:Java PlatformStandard Edition,完成桌面应用程序的开发,是其它两者的基础: J2ME:Jav

oracle Java编码规范

最近看java编码规范,借鉴petercao的原文翻译并做了改动,还有没有改完的地方,欢迎指正. 原文地址如下 http://www.cnblogs.com/bluestorm/archive/2012/10/04/2711540.html Oracle官方Java编码规范(英文版) http://www.oracle.com/technetwork/java/codeconvtoc-136057.html 1 介绍(Introduction) 1.1 为什么要有编码规范(Why Have Co

规定自己的Java编码规范

给自己规定了Java编码规范,编写Java代码严格按照自己规定的格式.欢迎大家指出问题. /* *COPYRIGHT */ package com.triangle23.projectabbreviationname.modulename.???.???. ##1.所有字母都是用小写,不要有特殊字符 ##2.组合单词的每个部分都写全拼,连接时各个部分之间不要有特殊符号,组合单词不要超过三个,每个部分都用名词,尽量用英文,中文的话用拼音 ##3.projectabbreviationname和mo

标准的Java编码规范手册

编码规范体现出一个开发者的基本素质,良好的编码规范可以提高团队编码的效率,避免很多不必要的问题.今天分享一个标准的Java编码规范给大家,希望对于大家今后的开发工作带来帮助. 编码规范的意义 在项目开发维护中,编码规范作为开发规范的一个组成部分,是十分重要和必须的,它不仅仅是为了提高开发效率,也有利于降低后期维护开发的成本.编码规范的根本目的就是要让不仅代码可以一目了然,也可以很容易的理解开发人员所编写的代码程的用途和意义.由此,用来减少项目中因为开发维护人员的更替或由于长时间不维护造成的记忆模

CheckStyle,定制自己的Java编码规范

前言 一.CheckStyle简介 Checkstyle是一个开发工具,可以帮助程序员编写遵循编码标准的Java代码.它自动化了检查Java代码的过程,以避免人类完成这一枯燥(但很重要)的任务.这使得它非常适合那些希望实施编码标准的项目.Checkstyle是高度可配置的,可以支持几乎任何编码标准,默认内置Sun Java编码规范和Google Java编码规范两套配置文件,我们也可以根据自己的需要配置自己的规范. 二.CheckStyle的安装 与其它的插件一样,CheckStyle插件也提供

Java 编码规范(转)

本文转自:http://www.javaranger.com/archives/390 文章总结出了java编码过程中的一些规范,以便参考. 1.合理组织代码层次,分层清晰:controller.logic.dao.对第三方接口(包括公司接口)的调用:各层要继承基类或实现接口 2.先定义方法原型,再实现方法体 3.理想的方法,是不可拆分的.原子的一个逻辑实现,具有一个明确的职责 4.方法体不超过70行,类体不超过500行 5.类名称.变量名称.方法名称,遵循简单明确,知名见义原则.建议不带数字,