Java开发规范目录第1章序言 (4)第2章java一般性研发规范 (5)2.1 代码格式 (5)2.1.1包、类、方法的命名规范: (5)2.1.2方法的命名应注意避免与java中具有特殊意义的名称例如equals,hashCode,clone,finalizer等冲突 (7)2.1.3Java bean中取得boolean类型的属性值必须使用is****形式命名 (9)2.1.4if,else,while,for等必须使用{} (9)2.1.5类必须包含在包里,禁止出现无包的类 (10)2.1.6类和方法必须拥有注释,注释量占总体代码25%以上,类头部,以及方法头部的注释应符合javadoc标准。
(11)2.2 基本语法 (12)2.2.1不能随意捕捉异常,原则上谁捕捉谁处理 (12)2.2.2if,while,try,finally,switch ,synchronized ,staticinstantiation 里面应有相应的逻辑处理,不能为空。
(13)2.2.3在处理循环中,不能在程序中人为的改变步长。
(14)2.2.4将简单类型int,short,float,double等转化成字符串时,需使用其对应类的toString方法。
(14)2.2.5javaBean中hashCode,以及equals方法必须同时override。
(15)2.2.6懒式方式创建对象:不能采用双检查惯用法 (18)2.2.7不能在finally中返回值。
(19)2.2.8Boolean实例化时,应用使用Boolean.valueOf,Boolean.TRUE,Boolean.FALSE。
(19)2.2.9Integer,Byte,Short,Long等实例化时,应用使用valueOf (20)2.2.10对于多个if语句嵌套的情况下能够整合尽量整合。
(20)2.2.11override function,不能只有super.function语句,否则视为无效代码212.2.12Collection.toArray的注意事项。
(21)2.2.13对于BigDecimal方法,应避免使用float值,double值进行创建,应使用字符串形式创建。
(22)2.2.14String,BigDecimal,BigInteger等值类型调用replace,add等方法的注意事项。
(23)2.2.15需要注意的引起NullException的语句。
(23)2.2.16ResultSet使用next时,需要判断是否具有记录再进行一下步操作。
252.2.17字符串使用相应的规则。
(25)2.2.18禁止直接调用System.gc(),System.getRuntime().gc(),System.runFinalization()。
(27)2.2.19finalize相应的规则。
(27)2.2.20禁止在代码中使用System.out,ex.printStackTrace打印日志。
(28)2.2.21系统资源释放(谁创建的,谁关闭) (29)2.2.22使用Clone时相应的规则。
(32)2.2.23java Bean类必须实现Serialize接口。
(33)2.2.24比较对象相等应使用equals,而不是==。
(33)2.2.25Array数组拷贝应使用System.arrayCopy。
(34)2.3 耦合性以及设计 (34)2.3.1switch语句必须包含default标签。
(34)2.3.2精简boolean表达式以及boolean返回值。
(35)2.3.3在方法实现中应避免对输入的值参进行改变。
(36)2.3.4在创建方法中,应避免调用被override的方法 (36)2.3.5public static常量属性必须final。
(37)2.3.6Abstract 类必须含有abstract方法。
(37)2.3.7接口依赖性。
(38)2.4 代码质量因素 (39)2.4.1Class代码行数限制 (39)2.4.2函数代码质量 (39)第3章java安全性检查规范 (41)3.1跨站脚本XSS (41)3.2违反信任边界规则(Trust Boundary Violation) (42)3.3不安全的反射(Unsafe Reflection) (43)3.4SQL 注入(SQL Injection) (44)3.5系统信息泄露(System Information Leakage) (45)3.6资源注入(resource injection) (45)第1章序言本规范的目的在于:建立一个可行可操作的编程标准、约定和指南,以规范公司java代码研发工作。
2009年为公司的质量年,为了提高公司研发能力,该规范的制定是为了规范java代码开发,提高java开发质量,从代码的层面规范并提高java项目的研发水平。
该规范由运营中心技术小组制定,运营中心技术小组将结合PMD检查工具以及相应的检查工具,组织技术监控人员对重点项目以及新的java项目定期检查,对代码质量进行评估,对代码质量较差限期整改,并报运营中心备案作为项目考核依据。
本规范适用于2009年公司java代码研发规范。
本规范的内容包括两个方面:java开发一般规范,以及java代码开发安全性规范。
Java代码开发一般规范主要从java基本语法,代码格式,耦合性以及设计方面,以及代码质量因子等进行描述;java代码开发安全性规范主要从sql注入,资源注入,跨站脚步,安全边界违例,系统信息泄露进行描述。
为了方便并配合PMD检查工具等相应检查工具,方便开发者针对违规代码进行调整,本规范中java一般开发规范描述形式将结合PMD,并提供示例代码,其形式如下:⏹规范描述:⏹PMD规则名称:⏹PMD级别(注1):⏹违规示例代码:⏹合法示例代码:本规范中java安全开发规范部分将结合具体项目,对出现安全隐患的代码进行分析,以及相应的解决办法和思路上进行分析,其具体格式如下:⏹风险及危害:⏹应对措施:⏹非安全代码示例⏹安全代码示例本规范解释权归运营中心技术小组,属于运营中心为了提供公司研发水平以及质量的一系列措施中的一部分,在后续的版本中将根据具体需要进行修改以及调整。
技术小组审核后给出相应的整改意见,对于有争议的问题,可直接与运营中心技术小组领导成员沟通。
第2章java一般性研发规范2.1 代码格式2.1.1包、类、方法的命名规范:⏹规范描述:包,类,方法命名只能为27个英文字符以及数字,不能包括特殊字符例如-,_,$等;包命名,首字符必须小写;类命名,首字符必须大写;方法命名,首字符必须小写;常量命名,必须全部大写;变量,以及属性命名,首字符必须小写;在类中非创建方法其命名应避免与类命一致;在类中属性的命名应避免与类命一致;在同一类中属新命名应避免与方法命名一致;在方法中命名临时变量时应避免与方法的参数名一致;⏹PMD规则名称:AvoidDollarSignsPackageCaseClassNamingConventionsMethodNamingConventionsSuspiciousConstantFieldNameVariableNamingConventionsMethodWithSameNameAsEnclosingClassAvoidFieldNameMatchingTypeNameMisleadingVariableName⏹规则级别:Error Highwarn Highwarn Highwarn Highwarn HighError HighError HighError High⏹违规示例代码:1、常量、变量命名public static final int my_num = 0; //常量应大写public String MyTest = ""; //变量命名,首字符小写DataModule DMTest = new DataModule();//变量命名,首字符小写2、方法命名public class Foo {public void FooStuff() {}}3、类命名:首字符应大写public class foo {}4、非法使用特殊字符命名public class Fo$o { // yikes!}5、非创建方法命名应避免与类名一致public class MyClass {// this is bad because it is a methodpublic void MyClass() {}// this is OK because it is a constructorpublic MyClass() {}}6、方法中临时变量的命名应避免与其参数一致:public void bar(String m_baz) { // Badint m_boz = 42; // Bad}7、在类中属性的命名应避免与类命一致:public class Foo extends Bar {// There's probably a better name for fooint foo;}8、在同一类中属性命名应避免与方法命名一致:public class Foo {Object bar;// bar is data or an action or both?void bar() {}}⏹合法代码示例:1、常量、变量命名:public static final int MY_NUM = 0; //public String myTest = "";DataModule dmTest = new DataModule();2、方法命名:首字符应小写public class Foo {public void fooStuff() {}}3、类命名:首字符应大写public class Foo {}2.1.2方法的命名应注意避免与java中具有特殊意义的名称例如equals,hashCode,clone,finalizer等冲突⏹规范描述:在java中某些方法是具有特殊意义的,例如boolean equals(Object o)是比较两个对象是否相;int hashCode()取得hash值,主要用于hash表;Object clone()用于复制对象;void finalizer()用于该类实例化的对象释放时系统调用释放该对象使用的资源。
这些方法具有固定的形参格式,固定的返回值,不能被其他形式或者用于其他方面的方法override,否则将降低代码可读性,并为代码维护带来隐患。