java代码高级规范.doc_第1页
java代码高级规范.doc_第2页
java代码高级规范.doc_第3页
java代码高级规范.doc_第4页
java代码高级规范.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java高级规范 Added by 王岳峰, last edited by 王岳峰 on 八月 06, 2009 (view change) Comment: 一:不允许使用汉语拼音命名 欠规范代码示例: public void zengJiaYongHu() 拼音方法名称 规范代码示例: public void addUser() 解析:应当使用国际化语言,拼音使得代码难懂二:Package名必须全部小写,尽量使用单个单词 欠规范代码示例: com.lxit.daoImpl 单词大写了,daoImpl多个单词 规范代码示例: com.lxit.dao.impl 解析:这是一个大家都认同的习惯写法,也是一个默认的规范三:局部变量及输入参数不要与类成员变量同名(get/set方法与构造函数除外) 欠规范代码示例: public class UserDAOImpl private int count; pubic void page(int count) 类字段和方法参数名相同 规范代码示例: public class UserDAOImpl private int count; pubic void page(int pageCount) 解析:类变量会引起逻辑错误,引起覆盖。四:尽量不要在变量后面加魔法数字,英文单个字母和没有实际意义的英文数字单词来区分变量 欠规范代码示例: String One; 命名一个英文数字的变量 User user1 = new User(); User user2 = new User(); 规范代码示例: User userAdd = new User(); User userUpdate = new User(); 解析:这样会降低代码的可读性,并且不容易日后开发人员的维护五:包,类,变量命名不要加下划线(常量除外) 欠规范代码示例: com.tag_test.dao.jdbc_impl 有下划线的包名 int user_age ; 带下划线的变量名 public class Class_ 带下划线的类名 规范代码示例: com.tag.test.dao.jdbc.impl int userAge ; public class Classes 解析:一种习惯性的用法,默认的规范六:常量命名要大写,单词之间要用下划线分开. 欠规范代码示例: public void static final String teamAdd = teamAdd; 小写且没有下划线 规范代码示例: public void static final String TEAM_ADD = teamAdd; 解析:容易区分变量和常量七:方法名第一个字母小写(构造方法除外). 欠规范代码示例: public void Function() 大写的方法名 规范代码示例: public void function() 解析:习惯用法,默认的规范八:两个单词以上的变量名要驼峰命名 欠规范代码示例: int userage; age 单词a 小写 欠规范代码示例: int userAge; 解析:能够更清晰的看懂变量所带代表的意思九:每个变量要用看得懂的词语来描述,尽量不要省略. 欠规范代码示例: private Studeng stu ; 把student 简写成 stu 规范代码示例: private Student student; 解析:使代码看起来清晰使人易懂十:一个类的命名一般是名词(有些ing的动词,形容词除外),变量名也是一样.函数的命名必须是动宾短语(构造词除外). 欠规范代码示例: public class Manage 动词类命 规范代码示例: public class UserManage 解析:能使别人一看到类名就知道这个类大概是做什么的。十一:数据库连接对象的生成不能跟Model层混搅,必须将其放在一个单独的类里,用单例模式来实现数据库的连接. 欠规范代码示例: public class UserDAOImpl() private static Connection connection; public static synchronized Connection getConnection() if (connection = null) trycatch (SQLException e) catch (ClassNotFoundException e) e.printStackTrace() return connection; 规范代码示例: public class DBConnectionTools private static Connection connection; private DBConnectionTools() public static synchronized Connection getConnection() if (connection = null) try Class.forName(Constants.MYSQL_DRIVER); connection = DriverManager.getConnection(Constants.MYSQL_URL, Constants.MYSQL_USER_NAME, Constants.MYSQL_PASSWORD); catch (SQLException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace(); return connection; 解析:数据库连接应当单独出去出来,以便其它类可以复用 十二: id一般不用int类型,用long类型 欠规范代码示例: int id; int 类型的关于人员的id 规范代码示例: Long id; 解析:随着id的增长,当增长的id超出int的范围的时候就会出现异常十三:sql语句一定要用占位符,不能用拼写组成的语句 欠规范代码示例:public void addUser(User user) String sql=insert into stu(ID,name,sex,address) values(user.getId(),user.getName(),user.getSex(),user.getAddress() ; /?则代表占位符 规范代码示例: public void addUser() sql=insert into stu(ID,name,sex,address) values(?,?,?,?) /?则代表占位符 /可用预处理来发送sql语句 解析:很容易出现错误,而且不清晰,不容易让人读懂。十四:PreparedStatement 最好不要声明为类字段. 欠规范代码示例:public class UserDAOImpl() private PreparedStatement preparedStatement; 规范代码示例:public class UserDAOImpl public void addUser() PreparedStatement preparedStatement =new PreparedStatement(sql); 解析:虽然很多类都使用到了PrepareStatement对象,但各个方法里用到的PrepareStatement对象都是不同的, 所以不能作为类字段,抽取出来做类字段的话会出现数据混乱的问题十五:做主键的列没有任何业务逻辑,没有任何实际意义,而且任何时候都不能修改。 欠规范主键示例:主键用一个身份证号码,或者学号 规范主键示例:主键用id,唯一性的,不可改变的。 解析:虽然身份证号码和学号也是唯一性的,但是他们是有意义的列,而且在程序升级时是可以更改的, 而id主要就是用来做主键的十六:取记录的时候,拿数据库条件语句去比较,不要自己用Java代码去比较. 欠规范代码示例: public void deleteById(Lont id) String sql = select id,name,age from user; /. ResultSet result = ResultSet.executeQuery(); where(result.next() if(result.getLong(id)=id) /.删除 规范代码示例: public void deleteById(Long id) String sql = delete from user where id = ?; /删除操作 解析:一旦取出的数据量过大,而用java代码的if判断的话,会影响运行速率,还可能导致内存不足等错误。十七:代码提交之前必须写注释,不管什么原因. 欠规范代码示例:暂时无 规范代码示例: 暂时无 解析:使别人能够很清晰的你知道做了哪些修改十八:提交之前先更新代码. 欠规范代码示例:暂时无 规范代码示例: 暂时无 解析:防止出现冲突十九:只要系统有红色错误,那么就不能提交,提交前要保证编译错误全部消除. 欠规范代码示例: 暂时无 规范代码示例: 暂时无 解析:如果上传了错误的代码,会导致别人因为下载了错误代码而带来开发上的问题二十:每个人的代码每天尽量上传,代码在本地的时间不要超过2天. 欠规范代码示例: 暂时无 规范代码示例: 暂时无 解析:保持与资源库的同步二十一:提交java代码前应该检查是否有没用的语句如:(System.out.println();),jsp页面上面是否有alert调试信息. 欠规范代码示例: 暂时无 规范代码示例: 暂时无 解析:因为如果保留了有可能会影响到程序正常运行的结果,如:for(int i=0;i10;i+) System.out.println(i);/如果测试for语句里有没有执行for(int i=0;i10;i+) System.out.println(测试代码是否运行到这里); System.out.println(i); 如果没有删除测试语句,则结果就会不一样了, 二十二:两个不同的包不能出现相同的文件名 欠规范示例: packge com.lxitedu.work.MyWork.java packge com.lxitedu.task.MyWork.java 规范示例: packge com.lxitedu.work.MyWork.java packge com.lxitedu.task.Work.java 解析:当一个在一个庞大的系统的时候,很可能引起混淆二十三:提交代码前如果有TODO标签,要删除掉,如果要标记没有做完的任务或者以后要改进的任务,用LXTODO. 欠规范代码示例: 暂时无 规范代码示例:暂时无 解析:暂时无二十四:注释掉的代码提交前要删除。 欠规范代码示例:/*public void add() if(true) System.out.println(这段代码已 经给注释掉了,程序中没有用到); */ 提交前没有删除这段代码 规范代码示例:删掉就行了 解析:既然代码在程序中没有用到的话就要删除,以免其他队员看到误解和浪费他人时间来读其代码。二十五:代码提交的注释里面不要加自己的名字. 欠规范代码示例:暂时无 规范代码示例: 暂时无 解析:因为提交的时候,系统已经帮你提交了用户名。二十六:PreparedStatement、ResultSet、Statement.对象用完之后必须进行调用close()将会关闭,立即释放此 Statement 对象的数据库和 JDBC 资源,不然会占用系统很多资源. / 此规范可以用适配器模式解决,不必手动去关闭了二十七:尽量不要在构造方法里初始化. 欠规范代码示例:public class Person public Person() Person person = new Person(); add(); 规范代码示例:public class Person public Person()Unknown macro: /尽量少做些不必要的事情 解析:因为在构造器里初始化没办法控制,构造器多了也容易出现混乱。如果有反射机制,也许会跳过构造方法。二十八:函数的返回值类型(如果有的话)要和其功能相匹配,要符合常规思维. 欠规范代码示例: 得到一个用户的姓名 public String getPeopleName() return userName; 规范代码示例: 得到一个用户的姓名的方法public String getUserName() return userName; 解析:是得到一个用户的姓名,而不是得到一个人的姓名,因为人不一定是用户,所以用getUserName更准确一点二十九:内部类的变量不要设为全局变量,尽量少用全局变量. 欠规范代码示例:暂时无 规范代码示例:暂时无 解析:暂时无三十:如果是布尔型的变量则最好在命名用is或has开头。例如:isVisible,isExists等. 欠规范代码示例: boolean isTrue=resultSet.next(); 规范代码示例: boolean hasNext=resultSet.next(); 解析:难懂,且没有任何意义。 三十一:如果变量命名要加注释,说明命名不是很准确. 欠规范代码示例:暂时无 规范代码示例:暂时无 解析:暂时无三十二:任何类字段除非必要,否则都要私有化. 欠规范代码示例:public class Person String name; String sex; int age; 规范代码示例: public class ClassName private String name; private String sex; private int age; 解析:没有为程序的安全考虑。可以被其他的类访问三十三:尽量减少一个类属性的作用域,在离使用它的最近的地方定义. 欠规范代码示例: int index = 1;/类似这种情况 变量生命离使用地方有点远 String sql = insert into student(ID,name,password,sex,address) values(?,?,?,?,?); PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(index+, user.getID(); preparedStatement.setString(index+, user.getName(); preparedStatement.setString(index+, user.getPassword(); preparedStatement.setString(index+, user.getSex(); preparedStatement.setString(index+, user.getAddress(); preparedStatement.executeUpdate(); preparedStatement.close(); 规范代码示例: String sql = insert into student(ID,name,password,sex,address) values(?,?,?,?,?); PreparedStatement preparedStatement = connection.prepareStatement(sql); int index = 1; preparedStatement.setString(index+, user.getID(); preparedStatement.setString(index+, user.getName(); preparedStatement.setString(index+, user.getPassword(); preparedStatement.setString(index+, user.getSex(); preparedStatement.setString(index+, user.getAddress(); preparedStatement.executeUpdate(); preparedStatement.close(); 解析:当别人维护易引起混淆,容易引发错误 三十四:单例模式的使用必须要考虑到同步. 欠规范代码示例: /没有使用到同步public static Connection getConnection() throws ClassNotFoundException, SQLException if(conn=null) Class.forName(com.p6spy.engine.spy.P6SpyDriver); conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test,root, root); return conn; 规范代码示例:/最熟悉的得到一个Connection连接public static synchronized Connection getConnection() throws ClassNotFoundException, SQLException if(conn=null) Class.forName(com.p6spy.engine.spy.P6SpyDriver); conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test,root, root); return conn; 解析:当有多个用户并发使用的时候会造成数据的混乱,导致线程不安全三十五:方法里面参数最好不要超过三个. 欠规范代码示例:public void update (int id ,String name,String code,String sex) . 规范代码示例: public void update (int id,String name,String sex) . or/如果超过三个 必须把数据封装成一个pojo 如下把上面update方法中参数封装起来 public class User() private int id; private String name; public String getName() return name; public void setName(String name) = name; public String getCode() return code; public void setCode(String code) this.code= code; public void setId(int id) this.id = id; public int getId() return id; public void update (User user) . 解析:参数多容易出现错误。尤其是调用的时候,如果参数的顺序传错了,将是一个非常大的麻烦,而且没有拓展性三十六:值类或值对象必须重写toString方法. 欠规范代码示例:public class Code private int id; private String name; private String sex; public String getName() return name; public void setName(String name) = name; public String getSex() return viscera; public void setSex(String sex) this.viscera = viscera; public void setId(int id) this.id = id; public int getId() return id; 规范代码示例:public class Person private int id; private String name; private String sex; public String getName() return name; public void setName(String name) = name; public String getSex() return sex; public void setSex(String sex) this.sex= sex; public void setId(int id) this.id = id; public int getId() return id; public String toString() return new StringBuffer().append(id+,).append(name+,).append(sex).toString(); 解析:toString的作用是一字符串的形式来返回它的实例信息,因为不同的类的信息时不同的,所以要重写,不能全部都继承Object的toString方法。三十七:重写equals方法的时候,必须重写hashCode方法. 欠规范代码示例: public class People /必要的属性 /必要的get和set方法 /toString 方法 没有hashCode方法 没有equals方法 规范代码示例: public class People /必要的属性 /必要的get和set方法 /toString 方法 public int hashCode() final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + (name = null) ? 0 : name.hashCode(); result = prime * result + (viscera = null) ? 0 : viscera.hashCode(); return result; public boolean equals(Object obj) if (this = obj) return true; if (obj = null) return false; if (getClass() != obj.getClass() return false; Code other = (Code) obj; if (id != other.id) return false; if (name = null) if ( != null) return false; else if (!name.equals() return false; if (viscera = null) if (other.viscera != null) return false; else if (!viscera.equals(other.viscera) return false; return true; 解析:重写equals和hashcode方法是为了像Set一样不能存储重复的元素,实现serializable是为了使这个类可以序列化三十八:单元测试的时候必须是对象比较,如果一个字段有100个字,有时候数据库会自动删除一些,此时我们就不知道程序那出bug了 欠规范代码示例:暂时无 规范代码示例:暂时无 解析:实用的开发经验三十九:单元测试类名后面要加Test. 欠规范代码示例: /这是一个UserDAO的单元测试类 public class UserDAO 规范代码示例: public class UserDAOTest 解析:这样写让别人知道这个类是用做测试的,清晰易懂四十:操作提示颜色,成功用蓝色字体,错误用红色字体. 欠规范代码示例: 暂时无 规范代码示例: 暂时无 解析: 暂时无四十一:控制层不能调用model层除了最顶级的接口外任何内容。要通过new顶级接口才能调用 欠规范代码示例: public class UserServiceImpl private UserDAOImpl userDAOImpl; public UserServiceImpl() userDAOImpl = new UserDAOImpl(); public void deleteById(Long id) userDAOImpl.deleteById(id); 规范代码示例: public class UserServiceImpl private UserDAO userDAO=null; public UserServiceImpl() userDAO = DAOFactory.getUserDAO(); public void deleteById(Long id) userDAO.deleteById(id); 解析:这样做不仅是为了程序的灵活着想,更是为了使代码的层次结构清晰明了四十二:返回类型尽量是父类接口或是抽象类,例如:要取得一个arrayList对象,则返回类型要用List。 欠规范代码示例: /返回一个只能是保存User对象元素的list public ArrayList query() ArrayList arrayList=new ArrayList(); . return arrayList; 规范代码示例:; public List query() List list=new ArrayList(); . return list; 解析:扩大对象的接受范围,更有拓展性四十三:SQL程序里命名要注意,不能把关键词作为属性. 欠规范代码示例: create tableName id bigint primary key, describe varchar(20) 规范代码示例: creat tableName id bigint not null primary key, classDescribe varchar(20) 解析:SQL语句里字段名为关键字时,执行时就可能会出现问题,出错了很难找,所以在开始的时候就要注意. 四十四:使用try.catch时,一定要捕获且打印异常 欠规范代码示例: try /代码块 catch (Exception e) 规范代码示例: try /代码块catch (Exception e) e.printStackTrace(); 解析:如果程序出现了异常,而catch块又没有任何错误输出,那么你的程序将永远不会报错,就无法发现错误,但是你的程序 总是有问题的,但又很难发现错误在哪里四十五:当能够用工厂实例化对象的时候不要用构造器生成对象,要用工厂方法去代替。 欠规范代码示例: UsreDAO userDAO = new UserDAOImpl(); 规范代码示例: UserDAO userDAO = DAOFactory.getUserDAO(); 解析:为了程序扩展性考虑,当构造器里的改变的时候,比如说增加一个参数,可能会因为系统过于庞大而忘记了修改 而用工厂模式可以一劳永逸 四十六:属性不能成为一个类 也不能成为一个函数名. 欠规范代码示例: public class Name public void sex() - - - 规范代码示例: public class Person public void addPerson() - - - 解析:对象的属性只能作为属性,不能单独做一个类四十七:如果一个方法的返回值是用来做判断的,返回值最好不要用字符串,要用int, 欠规范代码示例: /比如说修改后要提示修改该成功 public String updateUser(User user) . if(true) /成功 return 修改成功; else /失败 return 修改失败; 规范代码示例: public int updateUser(User user) . if() /成功 return 1; else /失败 return 0; 解析:因为字符串容易引发潜在的错误,比如失误的操作使得字符串多了个空格等等。四十八:在eclipse中,一次启动的工程最好不要超过两个以上。 不可取的操作: 在tomcat中一次加载多个(两个以上)工程 正确的操作: 加载的工程最多不要超过两个,不用的工程关闭 解析:启动多了占用资源,出错了检查也不方便,也容易起冲突 五十:工程保存路径不能有空格,中文和特殊字符。 不可取路径:E:studytools安装my toolseclipse 正确的路径:E:studytoolsinstalledmytoolseclipse 解析:如果出现此类状况,会影响一些工具的应用,影响程序的运行。五十一:在类中,重复了两次以上且公用的变量一般都要抽出成为类字段。 欠规范代码示例: public class ClassDAOImpl public void addClass() Connection conn=Tools.getConnection(); public void deleteById(int ID) Connection conn = Tools.getConnection(); 规范代码示例: public class ClassDAOImpl private Connection conn; public void addClass() conn = Tools.getConnection(); public void deleteById(int ID) conn = Tools.getConnection(); . 解析:增加代码的可读性,五

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论