学习中遇到的Java规范

作程序员重要的是什么?有人问过你这样的问题吗?

知识,语言基础好?技术好?逻辑思维强?英语好?…………

也许作为一位优秀的程序员,每个人的身上都有这样那样的优点,但是既然有优点就会有缺点,而且别

人的一些优点或者天生的优势可能不是那么容易让更多的人去努力能够达到的。但是不管怎么样,做到

什么程度,程序员都必须要遵守一些规范,而且规范遵守和做的越好的程序员,不仅程序漂亮,其他方

便也会非常优秀。

我学习编程语言应该有八年时间了,从最初的C语言到最喜欢的Java,甚至汇编语言,PLC,因为经历了

学校到工作,从工作再到学校的几次转变,我深刻的体会到规范对于代码编写的重要性。

在学校的时候,学习编程语言可以说是完全的照本宣科,有的老师一整个学期都在念ppt,你很少或者根

本不会看到你的老师去调试和编写代码。更不要说实际操作代码是书写的时候,会出现这样的那样的问

题。因为有些问题不是说你完全按照书本上的就可以了。最简单的一个例子就是,书本上的版本和环境

往往跟不上实际工作状况,所以出现一些问题,书本的规范会让你越陷越深。

学校出来了,我参加了一份工作,当时我几乎是从头开始学习的,尤其是工作过程中的规范和参考标准

。当熬过几天几夜之后,你才会明白“实践是检验真理的唯一标准!“

在工作的时候我学习了PLC语言的编程,这是一种非常简单的语言,有过语言学习基础的人基本上可以很

轻松的拿下它。可是问题来了,由于这门语言完全是纯粹的IO语言,不同的IO生产厂商都有自己的标准

和方法。所以参照他们的标准和规范就非常有必要。一个IO输入输出可能就是机器的停止与前进,错误

的话后果很严重。这段时间我反复的听到一个词就是规范。

现在又开始Java语言的学习,现在就对比学校学到的语言,总结一些Java语言需要遵守的规范。有些不

是Java特别要求的语言规范,而是实际应用中更高效和提高代码生命力的习惯方法。

1

Package 的命名

  Package 的名字应该都是由一个小写单词组成。Package的命名:Package 的名字应该都是由一个小

写单词成。

Class 的命名:Class 的名字必须由大写字母开头而其他字母都小写的单词组成

Static Final 变量的命名:Static Final 变量的名字应该都大写,并且指出完整含义。

参数的命名:参数的名字必须和变量的命名规范一致。

数组的命名:数组应该总是用下面的方式来命名: byte[] buffer; 而不是 byte buffer[];

方法的参数:使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:

SetCounter(int size){

this.size = size;

}

Class 的命名

  Class 的名字必须由大写字母开头而其他字母都小写的单词组成

Class 变量的命名

  变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。

Static Final 变量的命名

  Static Final 变量的名字应该都大写,并且指出完整含义。

2

参数的命名

  参数的名字必须和变量的命名规范一致。

  

数组的命名

  数组应该总是用下面的方式来命名:

  byte[] buffer;

  而不是:

  byte buffer[];

  

方法的参数

  使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:

  SetCounter(int size){

  this.size = size;

  }

3

Java 文件样式

  所有的 Java(*.java) 文件都必须遵守如下的样式规则

  

版权信息

  版权信息必须在 java 文件的开头,比如:

  /**

  * Copyright ?0?3 2000 Shanghai XXX Co. Ltd.

  * All right reserved.

  */

  其他不需要出现在 javadoc 的信息也可以包含在这里。

4

Package/Imports

package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。

如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。

  package hotlava.net.stats;

  import java.io.*;

  import java.util.Observable;

  import hotlava.util.Application;

  这里 java.io.* 使用来代替InputStream and OutputStream 的。

5

Class

  接下来的是类的注释,一般是用来解释类的。

  /**

  * A class representing a set of packet and byte counters

  * It is observable to allow it to be watched, but only

  * reports changes when the current set is complete

  */

  接下来是类定义,包含了在不同的行的 extends 和 implements

  public class CounterSet

  extends Observable

  implements Cloneable

  Class Fields

  接下来是类的成员变量:

  /**

  * Packet counters

  */

  protected int[] packets;

  public 的成员变量必须生成文档(JavaDoc)。proceted、private和 package 定义的成员变量如果

名字含义明确的话,可以没有注释。

6

存取方法

  接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一

行上。

  /**

  * Get the counters

  * @return an array containing the statistical data. This array has been

  * freshly allocated and can be modified by the caller.

  */

  public int[] getPackets() { return copyArray(packets, offset); }

  public int[] getBytes() { return copyArray(bytes, offset); }

  public int[] getPackets() { return packets; }

  public void setPackets(int[] packets) { this.packets = packets; }

  其它的方法不要写在一行上

7

构造函数

  接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。

访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中

,并且方法和参数另写一行,这样可以使方法和参数更易读。

  public

  CounterSet(int size){

  this.size = size;

  }

  

克隆方法

  如果这个类是可以被克隆的,那么下一步就是 clone 方法:

  public

  Object clone() {

  try {

  CounterSet obj = (CounterSet)super.clone();

  obj.packets = (int[])packets.clone();

  obj.size = size;

  return obj;

  }catch(CloneNotSupportedException e) {

  throw new InternalError("Unexpected CloneNotSUpportedException: " + e.getMessage());

  }

  }

8

类方法

  下面开始写类的方法:

  /**

  * Set the packet counters

  * (such as when restoring from a database)

  */

  protected final

  void setArray(int[] r1, int[] r2, int[] r3, int[] r4)

  throws IllegalArgumentException

  {

  // Ensure the arrays www.gzlij.com are of equal size

if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)

  throw new IllegalArgumentException("Arrays must be of the same size");

  System.arraycopy(r1, 0, r3, 0, r1.length);

  System.arraycopy(r2, 0, r4, 0, r1.length);

  }

9

toString 方法

  无论如何,每一个类都应该定义 toString 方法:

  public

  String toString() {

  String retval = "CounterSet: ";

  for (int i = 0; i < data.length(); i++) {

  retval += data.bytes.toString();

  retval += data.packets.toString();

  }

  return retval;

  }

  }

  

main 方法

  如果main(String[]) 方法已经定义了, 那么它应该写在类的底部.

1.1 一般要求

1、选择有意义的名字,能快速地传达该类的用途。

2、所有包的命名必须采用小写英文字母。

1.2 实际应用

应用系统中经常应用分层,Dao层(数据库访问)、Service层(业务处理)、Web层(页面控制action类

)。

1、包名的前几个为固定名称, 如果是网站的话,采用网站的域名的反写,如果域名还没有确定的话,采

用公司固定的几个名称。如:net.vschool

2、在包名的接下来一个单词为模块的名称。如:用户模块,包名为net.vschool.user

3、关于模块的访问操作,采用分层形式,一般分为:

Dao层操作:一般定义在net.vschool.xxx.dao 中,其中xxx为模块名称。

Service层操作:一般定义在net.vschool.xxx.servie中。

web层操作:一般定义在 net.vschool.xxx.action中。

如下关于用户模块的例子:

net.vschool.user

net.vschool.user.dao

net.vschool.user.action

net.vschool.user.service

二 类名的书写规范 (Class)

类名必须使用名词,如果一个类名内含多个单词,那么各个单词第一个字母大写,后续字母小写,起伏

呈驼峰状,人称驼峰式命名。给类名命名时,必须保证准确、简洁且容易理解。尽量使用完整单词,避

免使用缩写词(除了大家公认的)

2.1 类的命名

2.1.1 一般要求

1、选择有意义的名字,能快速地传达该类的用途。

2、参照java驼峰命名法,类名的首字母必须采用大写的形式,如果类名为多词组合而成的话,那么每个

词的首字母必须采用大写。如:StudentAnswer.java

3、当要区别接口类和实现类的时候,可以在类的后面加上“Impl”。

如:接口类:UserInterface.java   接口实现类:UserInterfaceImp

4、推荐实体类没有后缀名。

2.1.2 实际应用

应用系统中经常应用分层,Dao层(数据库访问)、Service层(业务处理)、Web层(页面控制action类

),每一层的类的名称尽量带上该层后缀。

1、Dao层

a、接口类:采用JavaBean+Interface+Dao的形式来定义,即,实体对象+Interface+Dao。

如:用户对象接口类: UserInterfaceDao,其中xxx为模块名称。

b、实现类:采用JavaBean+Interface+Impl+Dao的形式来定义,即,实体对象

+Interface+Impl+Dao。 如:用户对象实现类:UserInterfaceImplDao

2、Service层

a、接口类:采用Xxx+Interface+Service的形式来定义,即,模块+Interface+Service。

如:用户管理接口类:UserMsgInterfaceServiec

b、实现类:采用Xxx+Interface+Impl+Service的形式来定义,即,模块+Interface+

Impl+Service。如:用户管理实现类:UserMsgInterfaceImplServiec

3、Web层(action类)

a、实现类:采用县 Xxx+Operator+Action的形式来定义,即,模块+操作+Action。如

用户模块User+删除操作Delete+Action = UserDeleteAction

2.1 变量的命名

2.2.1 普通变量

2.2.2.1 一般要求

1、选择有意义的名字,能快速地传达该变量的用途。

2、参照java驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。

2.2.2.2 实际应用

1、变量命名采用基本结构为typeVariableName,使用3字符前缀来表示数据类型。

例如,定义一个整形变量:intDocCount,其中int表明数据类型,后面为表意的英文名,每个单词首字

母大写。

数据类型或对象类型

变量前缀

备注

byte

bye

1、做数组用时,再加前缀-a,如字符串数组:astr,

2、自定义类型的变量可以采用本身的名称,把首字母改为小写。

3、采用名称要能代表在方法中的意义。如果员工列表:employeeList

char

chr

float

flt

boolean

bln

Integer/int

int

short

sht

Long/long

lng

Double/double

dbl

string

str

2、变量使用技巧:

a、在一段函数中不使用同一个变量表示前后意义不同的两个数值。

b、除非是在循环中,否则一般不推荐使用单个字母作为变量名,i、j、k等只作为小型循环的循环索引

变量。

c、避免用Flag来命名状态变量。

d、用Is来命名逻辑变量,如:blnFileIsFound。通过这种给布尔变量肯定形式的命名方式,使得其它开

发人员能够更为清楚的理解布尔变量所代表的意义。

e、如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些

区域中使用intCnt,而在另一些区域中又使用intCount,就会给代码增加不必要的复杂性。建议变量名

中尽量不要出现缩写。

2.2.2 静态变量

1、选择有意义的名字,能快速地传达该变量的用途。

2、参照java驼峰命名法,采用全部大写的形式来书写,对于采用多词合成的变量采用“_”来连接各单

词。如:USER_LIST

2.3 方法的命名

2.3.1 一般要求

1、选择有意义的名字,能快速地传达该方法的用途。

2、参照java驼峰命名法,首字母以小写开头,每个单词首字母大写(第一个单词除外)。

2.3.2 实际应用

1、方法表示一种行为,它代表一种动作,最好是一个动词或者动词词组或者第一个单词为一个动词。

2、属性方法:以get/set开头,其后跟字段名称,字段名称首字母大写。如:getUserName()

3、数据层方法:只能以insert(插入),delete(删除),update(更新),select(查找),count(统

计)开头,其他层方法避免以这个5个单词开头,以免造成误解。

4、服务层方法,根据方法的行为命名,只描述方法的意义,而不采用方法的目的命名。比如系统的添加

新用户,用户可以前台注册,也可以管理员后台添加,方法会被重用,所以最好不要用使用register,

采用add会更好写。避免使用与web层相关的方法。

5、Web层方法最好是贴近web的语言,如register,login,logout等方法。

三 注释的书写规范 (Javadoc)

Java除了可以采用我们常见的注释方式(//、/* */)之外,Java语言规范还定义了一种特殊的注释,也

就是我们所说的Javadoc注释,以/**开头,而以*/结束, Javadoc 注释可以被自动转为在线文档,省去

了单独编写程序文档的麻烦。 推荐使用。

Javadoc注释主要涉及范围:类、属性、方法。

例如:

复制代码 代码如下:

package org.ietf.jgss;

import java.net.InetAddress;

import java.util.Arrays;

/**

* 该类的整体性描述。

*

* @author 作者

* @version 1.0, 05/22/07

* @since 1.0

*/

public class ChannelBinding {

/**

* 对该变量的备注信息

*/

private InetAddress initiator;

/**

* 对该变量的备注信息

*/

private InetAddress acceptor;

/**

* 对该变量的备注信息

*/

private  byte[] appData;

/**

* 对该类的构造函数的备注信息。

*

* @param initAddr 对参数的备注。

* @param acceptAddr对参数的备注。

* @param appData对参数的备注。

*/

public ChannelBinding(InetAddress initAddr, InetAddress acceptAddr,

byte[] appData) {

initiator = initAddr;

acceptor = acceptAddr;

if (appData != null) {

this.appData = new byte[appData.length];

java.lang.System.arraycopy(appData, 0, this.appData, 0,

appData.length);

}

}

/**

* 对该类的具体一函数的备注信息

*

* @param obj 参数的备注信息

* @return 返回值的备注信息

*/

public boolean equals(Object obj) {

if (this == obj)

return true;

if (! (obj instanceof ChannelBinding))

return false;

ChannelBinding cb = (ChannelBinding) obj;

return Arrays.equals(appData, cb.appData);

}

}

四 其他书写规范

4.1 Jsp页面名称的书写规范

1.全部采用小写的英文字符和”_ ”组成。

2.整体采用模块名+操作的形式。如:user_view.jsp

3.Jsp页面尽可能与action的意思对应,如UserListAction 对应者user_list.jsp

接口:

使用驼峰式命名。除了用名词外,还可以用形容词命名(体现其功能特性)

方法:

规定用动词命名,适合用驼峰式命名,但与类名的最大区别在于,首字母必须小写

变量:

规定为名词,其他同“方法”命名方式一样。变量名非常关键,应含有具体意义且易于理解,一般不允

许使用单个字母做变量名。除非一些临时性变量,像在循环中使用到的计数器等。在使用单个字母做变

量名时,一般I、J、K用来命名整形变量。

常量:

规定全用大写字母表示,如果名字必须用多个单词来表示,那么各单词间用“-“分隔。常量要求必须意

义明确,能表达出常量的含义。

时间: 2024-10-05 23:06:18

学习中遇到的Java规范的相关文章

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

java学习中,面向对象的三大特性:封装.继承.多态 以及 super关键字和方法的重写(java 学习中的小记录) 作者:王可利(Star·星星) 封装     权限修饰符:public 公共的,private 私有的     封装的步骤:          1.使用private 修饰需要封装的成员变量.          2.提供一个公开的方法设置或者访问私有的属性              设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写 访问 通过ge

有关JAVA基础学习中的集合讨论

    很高兴能在这里认识大家,我也是刚刚接触后端开发的学习者,相信很多朋友在学习中都会遇到很多头疼的问题,希望我们都能够把问题分享出来,把自己的学习思路整理出来,我们一起探讨一起成长.    今天我在这里简单讲解一下我对学习中集合的理解.很多朋友再写解释的时候,没有从最简单说起,造成了阅读中的困惑,或许我能帮助你对集合有一个新的认识.   首先当我们谈到集合的时候要了解一下集合的具体概念. java集合的概念是相对于数组来说的,那么什么是数组呢?   数组:数组是一段连续存储单元. 每个存储单

java学习中,object 对象的使用(toString、equals、hashCode)(java 学习中的小记录)

java学习中,object 对象的使用(java 学习中的小记录)作者:王可利(Star·星星) object 对象(参考API学习) 重点掌握三个方法: 1.toString 返回该对象的字符串表示. 2.equals(object obj)指示其他某个对象是否与这个对象相等. 3.hashCode() 返回对象的哈希码. 详见代码的注释分析(一个是Person类重写方法,一个是Star类使用方法) Star类代码: 1 package study; 2 3 public class sta

Java学习中,常用的命令管理(Java 学习中的小记录)

Java学习中,常用的命令管理      作者:王可利(Star·星星) 一.Window中常见的dos命令 在哪里操作dos命令: Win7 ---> 开始  ---->所有程序--->附件---->命令提示符 Win7-->  开始  --->运行  ---->输入cmd 1.1 盘符的切换: 盘符眀+冒号  格式: 盘符: 例子: 想从C盘到D盘 C:/User/xxxx  D: 1.2 文件夹的操作 dir :显示当前文件夹中的所有文件和文件夹. cd 路

JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLoc

java学习中,成员内部类、匿名内部类(java 学习中的小记录)

java学习中,成员内部类.匿名内部类(java 学习中的小记录)作者:王可利(Star·星星) 内部类: 一个类中定义另外一个类,这样的类叫内部类. 内部类的文件名:外部类名$内部类名.class    内部类分两种: 1.成员内部类 如何访问成员内部类:             方式1:外部类中定义一个方法来创建内部类对象,再通过对象进行访问.             方式2:可以直接在其他类中直接创建内部类这个对象,通过对象访问.用点语.                       格式:

Java 需要记得、了解的关键词 (Java 学习中的小记录)

Java 需要记得.了解的关键词 (Java 学习中的小记录)     作者:王可利(Star·星星) 总结:本次随笔,仅且拿来平时翻阅记忆用

Java基础学习中一些词语和语句的使用

在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看break和continue使用和运行效果的额说明: break:关键字,可以用于任何循环体控制结构,在循环体内执行时,当执行到break时循环会立即终止,并跳到此循环体以后的语句执行. 列如:输出0--10的数当输出到第六位时就不在继续输出了,即是跳出for循环执行for循环体以后的一句. public

java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常(java 学习中的小记录)

java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常(java 学习中的小记录)作者:王可利(Star·星星) 异常:(API 的 java.lang 有一个异常,有很多很多) 在Java程序中也会程序出现不正常的情况,这个就叫异常.     Java是面向对象的语言,任何事物都可以用类来描述,同样的异常也是一种事物.Java中提供了很多的异常类.     多个异常堆积起来,就是一个异常体系.   Throwable:是异常类的父类,超类.Exception 异常.error错误.