java代码括号风格 java括号的用法

java编程,花括号怎么用,有什么规则通常{}中间的代码是一个代码块,可以用作方法体、循环体、判断执行语句块等等,必须是成对出现的 。类class的范围也用大括号包裹 。
Java中的花括号下列两种哪种更规范?优选第一种;第二种是c/c编程时使用的较多,java早期也用 。追究规范问题,其实可以看各种开源框架源代码的编写风格就知道了,如spring,struts 。
java 方法 中 { } 括起来的代码 有什么特别?一、普通代码块
直接在一个方法中出现java代码括号风格的{}就称为普通代码块java代码括号风格,例子程序如下java代码括号风格:
public class CodeDemo01{
public static void main(String[] args){
//普通代码块
{
int x = 10;
System.out.println("x="x);
}
int x = 100;
System.out.println("x="x);
}
}
二、构造代码块
直接在类中定义的没有加static关键字的代码块{}称为构造代码块,例子程序如下:
public class CodeDemo02{
public CodeDemo02(){
System.out.println("========这是构造方法=========");
}
//这是构造代码块,而且在new对象时 , 构造代码块优先构造方法执行
{
System.out.println("=========这是构造块!=========");
}
public static void main(String[] args){
new CodeDemo02();
new CodeDemo02();
}
}
三、静态代码块
使用static关键字声明的代码块称为静态代码块 , 静态块的主要目的是用来为静态属性初始化,例子程序如下:
public class CodeDemo03
{
static{
System.out.println("这是主类中的静态代码块!");
}
public static void main(String[] args){
new Demo();
new Demo();
new Demo();
}
}
class Demo
{
static{
System.out.println("这是Demo类中的静态代码块!");
}
{
System.out.println("这是Demo类中的构造块!");
}
public Demo(){
System.out.println("这是构造方法!");
}
}
静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次java代码括号风格!
四、同步代码块
同步代码块主要出现在多线程中 。
什么是良好的编程风格(Java编程)首先,编程风格并不同于其他的style,目的并不是形成自己独树一帜的风格,而是为了让你的程序易读,有利于团队合作以及别人帮你改错 。
风格是通用的
C语言和C语言的编程风格 (Java见下)
第一章:缩进格式
Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受.
理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.
现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序.
总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序.
第二章:大符号的位置
另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始
的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所示:
if (x is true) { we do y }
然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位,如下:
int function(int x) { body of function }
所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白: (第一) KR是___对___的,(第二)如果KR不对,请参见第一条. (:-))......另外,函数也是特殊的,不一定非得一致.
需要注意的是结束的括号在它所占的那一行是空的,__除了__它跟随着同一条语句的继续符号.如"while"在do-while循环中,或者"else"在if语句中.如下:
do { body of do-loop } while (condition);
以及
if (x == y) { .. } else if (xy) { ... } else { .... }
理由: KR.
另外,注意到这种大括号的放置方法减小了空行的数量,但却没有减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空行来写些注释了.
第三章:命名系统
C是一种简洁的语言,那么,命名也应该是简洁的.同MODULE-2以及ASCAL语言不同的是,C程序员不使用诸如ThisVariableIsATemporaryCounter之类的命名方式.一个C语言的程序员会将之命名为"tmp",这很容易书写,且并不是那么难以去理解.
然而,当混合类型的名字不得不出现的时候,描述性名字对全局变量来说是必要的了.调用一个名为"foo"全局的函数是很让人恼火的.全局变量(只有你必须使用的时候才使用它) ,就象全局函数一样,需要描述性的命名方式.假如你有一个函数用来计算活动用户的数量,你应该这样命名--"count_active_users()"--或另外的相近的形式,你不应命名为"cntusr()".
有一种称为Hungarian命名方式,它将函数的类型编码写入变量名中,这种方式是脑子有毛病的一种表现---编译器知道这个类型而且会去检查它,而这样只会迷惑程序员. --知道为什么Micro$oft为什么会生产这么多"臭虫"程序了把!!.
局部变量的命名应该短小精悍.假如你有一个随机的整数循环计数器,它有可能有"i",如果没有任何可能使得它能被误解的话,将其写作"loop_counter"是效率低下的.同样的,""tmp"可以是任何临时数值的函数变量.
如果你害怕混淆你的局部变量的名字,还有另外一个问题,就是称
function-growth-hormone-imbalancesyndrome.
第四章:函数
函数应该短小而迷人,而且它只作一件事情.它应只覆盖一到两个屏幕(80*24一屏),并且只作一件事情,而且将它做好.(这不就是UNIX的风格吗,译者注).
一个函数的最大长度和函数的复杂程度以及缩进大小成反比.于是,如果你已经写了简单但长度较长的的函数,而且你已经对不同的情况做了很多很小的事情,写一个更长一点的函数也是无所谓的.
然而,假如你要写一个很复杂的函数,而且你已经估计到假如一般人读这个函数,他可能都不知道这个函数在说些什么,这个时候,使用具有描述性名字的有帮助的函数.
另外一个需要考虑的是局部变量的数量.他们不应该超过5-10个,否则你有可能会出错.重新考虑这个函数,将他们分割成更小的函数.人的大脑通常可以很容易的记住7件不同的事情,超过这个数量会引起混乱.你知道你很聪明,但是你可能仍想去明白2周以前的做的事情.
第5章:注释
注释是一件很好的事情,但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好:你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码.
通常情况下,你的注释是说明你的代码做些什么,而不是怎么做的.而且,要试图避免将注释插在一个函数体里:假如这个函数确实很复杂,你需要在其中有部分的注释,你应该回到第四章看看.你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分,但是你必须要避免过多.取而代之的是,将注释写在函数前,告诉别人它做些什么事情,和可能为什么要这样做.
第六章:你已经深陷其中了.
不要着急.你有可能已经被告之"GUN emacs"会自动的帮你处理C的源代码格式,而且你已经看到它确实如此,但是,缺省的情况下,它的作用还是不尽如人意(实际上,他们比随便敲出来的东西还要难看- ainfinite number of monkeys typing into GNU emacs would never make a good program)
于是,你可以要么不要使用GUN emacs,要么让它使用sanervalules.使用后者,你需要将如下的语句输入到你的.emacs文件中.(defun linux-c-mode() "C mode with adjusted defaults for use with the Linux kernel."(interactive) (c-mode) (c-set-style"KR") (setq c-basic-offset8))
这会定义一个M-x Linux-c-mode的命令.当你hacking一个模块的时候,如何你将-*- linux-c -*-输入在最开始的两行,这个模式会自动起作用.而且,你也许想加入如下
(setq auto-mode-alist (cons '("/usr/src/linux.*/.*.〖ch〗$" . linux-c-mode) auto-mode-alist))
到你的.emacs文件中,这样的话,当你在/usr/src/linux下编辑文件的时候,它会自动切换到linux-c-mode .
但是,假如你还不能让emaces去自动处理文件的格式,不要紧张,你还有一样东西: "缩进" .
GNU的缩进格式也很死板,这就是你为什么需要加上几行命令选项.然而,这还不算太坏,因为GNU缩进格式的创造者也记得KR的权威, (GNU没有罪,他们仅仅是在这件事情上错误的引导了人们) ,你要做的就只有输入选项"-kr -i8"(表示"KR,缩进8个字符).
"缩进"有很多功能,特别是当它建议你重新格式你的代码的时候,你应该看看帮助.但要记住: "缩进"不是风格很差的程序的万灵丹.
JAVA编程风格简析
很久以来都在体会着JAVA的风格,现在做一简单陈述,希望大家多提宝贵意见 。
对于一种好的编程语言 , 学习它的编程风格是很重要的 。每种语言都有自己的编写和注释约定,当然所有语言都建立在最基本的约定之上 。编程中最重要的并不是让代码按自己希望的方式运行,而是程序中那种自明的编程风格(这对于程序员的益处相信众多程序员都身有体会)!但这还不够,程序还应该具有可读、相对持久和可维护性 。可读性非常重要,因为你不希望自己以前的作品在之后的阅读中给自己留下障碍,当然,更重要的是自己的程序能让其他程序员读懂并且修改 。
下面我把工作中所理解的java风格做一简单总结 , 这是我所理解的好的编程风格和应用中我们应当如何使用java编写自己的代码的小Guide 。这并不完全,希望大家帮我陆续总结各自的经验 。
一般性概述
好的编程风格固然重要,但是你一定听说过一些程序员的个人风格 。其实我们完全不必为那些所谓条条框框所累,但是作为原则是我们至少不能打破这些常规 。我们应该在保持自己风格的同时尽量的把自己与编程潜原则靠拢 。
可读性很容易达到,比如,让自己的代码缩排排列、名字采用描述性但不要过长(短名应仅仅用在非远程)、特殊名称比如pi应当被定义为final类型 。模块性是编程需要注意的另一重点,把代码划分到类里,在类中把功能划分到方法中,别让一个类太大 , 否则在使用、修改和理解上都会造成不必要的麻烦 , 方法也一样,如果一个方法长度超过50行,它产生错误的概率将接近100%,尽量把大方法划分为小方法,编程中为避免重复编写,还应尽量调用JAVA标准类库 。
尽量避免在写代码和注释时使用不同语言,经常见到论坛有朋友询问诸如在java中调用c、调用php、调用shell之类的问题,其实在编程中,我们应尽量使用一种语言去完成事情 。另外就是不必最优化自己的代码,应该选择相对较优的算法就可以了 。
类、方法和fields
类应体现出某种物质的基本概念 , 比如要编程实现“汽车”的组成,那么所有的汽车都可以用类Car实现 。这个类应当包括域描述、属性描述和car的状态(color, number of doors, age等)和由car可完成的操作(getColor, setColor等) 。为了提高类的可重用性 , 不要在类中有过多的描述,当然这也会增加错误产生的机会 。
类名首字母大写,比如Date, String, Hashtable等 ... ...
类如下定义:(未使用Javadoc做注释):
public class Car {
/* Instance variables are placed either in the beginning
or at the end of the class */
private int age;
private Color color;
/* The constructor should be placed in the beginning */
public Car(int age, Color color) {
this.age = age;
this.color = color;
}
/* Example method */
public int getAge() {
return age;
}
/* The main method is optional, but looks like this.
If it exists, it is either the first or the last
method in the class */
public static void main(String [] args) {
...
}
}
注意类名和大括号间的空格!
方法
方法一般定义为public 。当然,如果方法仅仅在当前类用到可以定义为private , 而如果希望一个子类沿用这个方法则不同,这时候的方法应定义为protected 。
java中的方法定义很有趣,它们一般小写字母开头,如果有两个字组成,第二个字的首字母则大写 。因此名字的描述性是至关重要的 。这使你不用阅读整篇代码来判断这是一个什么方法 。在给自己的方法取名时应尽量不要太短或者太长,另一个需要注意的是大多方法使用动词(动宾短语) 。
例如:
public void eat() {}
public void eatBananas() {}
Selector(选择器)方法有get前缀,后缀是它们将要get的,比如
public int getBananas() {}
Mutator(存取器)方法则有set前缀 , 后缀则是他们要set的,比如
public void setBananas(int amount) {}
注意mutators大多无返回值 。
方法的参数应当以如下方式给出:
public void aMethod(type parameter1, type parameter2, ... , type parametern) {}
如果参数过长,也可以断开为几行,应对齐向下排列如:
public void aMethod(type parameter1, type parameter2,... ,
type parametern, type parameter n 1,... ,
type parameterm, type parameter m 1) {}
另外要注意类的左束括号应在方法的右束括号之后而非下一行:
public int aMethod() {
int i = 0;
if(i == 0)
System.out.println("success!");
}
为了文件可读性好,还要注意语句最好写在同一行,当然一行写不下是可以断行的,比如行字母超过80 。
fields
比如变量,如果不希望它永久有效,应设为private 。如果一个变量在类中不发生任何动作(比如数据结构中的node)则可以设置为public,常量一般声明为public 。如果不能确定一个变量到底该声明为什么,应暂且声明为private 。
field的名字一般使用小写字母,不要使用下横线或其他特殊字符 。如果变量包含两个字,那么第二个字的首字母大写 。比如:
int i, j, k;
Date date;
double myField;
常量一般全部大写,也可以包含下横线:
public static final int MAX_SIZE_OF_DATABASE
fields的名字通常为名词 。较重要的fields更应具备描述性,比如程序中包含一个游戏的得分,那可以用score来代表 。如果变量变化较频繁,那使用一个单一字符来代表就ok了:
i, j, k 通常代表整数
r, t, u, v, w 通常代表实数
x, y, z 通常是并列出现或代表浮点数
s, s1, s2, 通常代表字符串
c, ch 通常代表字符
f, file 通常代表文件
tmp, temp 通常代表临时变量
ctr, cnt, cntr 一般代表计数器(如果i, j, k这些变量已被使用)
dummy, foo, bar 一般代表哑元变量
args 是main-method的主参数名
缩排与换行
每行长度不得超过80字符 。如果需要可以折行时,也应当与上一行有共同的缩排距离 。代码应如何交错、如何建立新行、在哪里建立允许、哪里不允许都有一些一般约定,缩排空格一般为2个或4个空格 。
条件表达式
如果见到如下语法表达式:
if (expr)
statement1;
else
statement2;
代码行向右错排两个空格如上所示 。
如果在一个表达式中有超过一条的声明,则需要大括号:
if (expr){
statement1;
statement2;
} else{
statement3;
statement4;
}
有时我们会希望在表达式中使用表达式(比如条件嵌套),这时应注意else表达式,它的位置很容易出错!如例:
if (expr1) {
statement1;
statement2;
} else if (expr2)
statement3;
else if (expr3) {
statement4;
statement5;
} else {
statement6;
statement7;
}
注意大括号位置!
Loops
while-loop语法如下:
while (expr) {
statement1;
statement2;
}
for-loop语法如下:
for (expr1; expr2; expr3){
statement1;
statement2;
}
注意大括号位置!仅一条声明时大括号省略:
while (expr)
statement;
for (expr1; expr2; expr3)
statement;
例如 , 我们写一个procedure写出1到10这十个数字:
for (i = 1; i = 10; i)
System.out.println(i);
try-catch语法形如:
try {
statements;
} catch (ExceptionClass e) {
statements;
}
如果try-catch语句后跟随finally子句则形如:
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
新行
每一行最好只阐述一件事情 。比如 , 一行包含一个声明、一个条件语句、一个循环等 。不论多小,最好不要一行办两件事及以上 。例如不要把一个if表达式或循环语句的主体放置在同一行,这样的表达式断行的易读性会更高 。通常 , 互相协作的代码应放在一起,为保证代码美观可读,我们应将代码的不同代码段放置在不同的段落 。不过要牢记断行不要太过分!比如:
public int factorial(int n) {
int result = 1;
for(int i = 1; i = n; i)
result*=i;
return result;
}
给自己的代码加入注释
注释就是类的描绘、方法存在的原因、它完成了什么以及它对它其中(变量)的作用域 。假定阅读你代码的人已经知道这是什么语言 , 所以不需要注释语句功能,尽量使用简短而有描述力的注释 。
Java有两种类型的注释:
//This is a comment that continues until the end of the line.
/* This is a comment. It goes on and on and on and on and on and on and on
and on and on and on and on and on and on and on and on and on and on and
on and on and on and on and on and on and on and on and ends like this: */
/**
* This is a JavaDoc comment. More about JavaDoc in the next section.
*/
如果在注释中加入注释则会出错:
/* You are not allowed to do anything like this /* because the compiler will
complain, if you are lucky */ DON'T DO THIS! And don't write comments in
upper case either... */
注释应放在它要解释内容上下 , 这样会让代码更易于理解 。
不要注释一些语言的语句功能:
i;// Add 1 to i
更不要让自己的代码处于这种状态:
for(int i = 1; i = n; i)
/* don't place comments where
they don't belong */
result*=i;
较短的注释既可被放在被注释代码上下,而长注释则习惯性的放在代码之上:
/* Comments can be placed before the
block that is to be commented */
for(int i = 1; i = n; i)
result*=i;
或者:
for(int i = 1; i = n; i){
result*=i;// short comments can be placed like this
tmp;// if necessary, they continue here
}
不要写没用的注释:
i;// change this later
Excuse me,这句肯定是胡扯!
不要写自己都看不懂的注释:
i;// BMW
BMW? 如果你能连续十天记住这是什么意思的话 , 那么你的记忆真是不错了 。所以不要写没人能看懂的注释,ok?
最后重申一下:写简短而富于描述性的注释,把它们放在该放的地方,而不要考验你自己的记忆力!
JavaDoc - 文档工具
JavaDoc不仅是另一种给代码加注释的仿佛咱,更是一个文档工具 。类、方法和一些重要地方需要用JavaDoc来注释 。这并不是说你可以放弃常规的注释,这两者在代码中应该是相辅相成、互相弥补的关系 。
类被注释如:
/**
* Car represents cars ... A description of the class
* should be place here. Note that the description begins
* on the second line and that there is a space between
* the asterix and the text. Next we will add some fields
* indicating who the authors of the class are and
* other useful information. Notice the newline!
*
* @author Jerry Meng
* @version %I%, %G%
*/
public class Car {
注意JavaDoc结束和类开始间无空行 。
方法被注释如:
/**
* A description of what the method does...
*
* @param na description of the parameter
* @returna description of the return value
*/
public int factorial(int n) {
某些不是全部,被JavaDoc注释区域如:
/**
* Short description of the variable (one line)
*/
type variable;
什么应当使用JavaDoc做注释?如何注释的恰当呢?
可以这样想 , JavaDoc中所作的注释都可以在类的文档中看到 。所有读这个类的文档的读者都会明白这个类所完成的功能、它包括的方法、如何使用这些方法及方法的返回值 。一些作用域,比如public的变量或常量将会一目了然 。任何不了解这个类内部结构的人都可以轻松的调用它 。这便是你用JavaDoc可以轻松提供的信息 。而使用一般注释的地方,一般是给那些可能修改你的类代码的程序员 , 它们一般描述了类的内部信息和结构 。
下面我写一下car的类来描述一个编程风格好的java类应该是怎样的 。当然这仅仅是一个小例子(apart from selector and mutator methods),仅仅是在考虑JAVA编程风格上一个参考而已 。
import java.awt.Color;
/**
* This is a class representing cars. A car has certain features, such
* as color, age, number of doors etc and a car can be repainted,
* the tank can be filled etc.
*
* @author Jerry Meng
* @version %I%, %G%
*/
public class Car {
/**
* The maximum size of the tank in litres.
*/
private static final double TANK_SIZE = 100.0;
/**
* The color of the car.
*/
private Color color;
/**
* The age of the car.
*/
private int age;
/**
* The number of doors of the car.
*/
private int doors;
/**
* The amount of gasoline in the tank.
*/
private double gasoline;
/**
* Class constructor, which constructs a brand new, black car with
* five doors and a full tank.
*/
public Car() {
this(Color.black, 0, 5, TANK_SIZE);
}
/**
* Class constructor specifying the color, age, number of doors
* and litres of gasoline
*
* @param colorThe color of the car
* @param ageThe age of the car
* @param doorsThe number of doors
* @param kmKilometres driven
* @param gasoline The litres of gasoline
*/
public Car(Color color, int age, int doors, double gasoline) {
this.color = color;
this.age = age;
this.doors = doors;
this.gasoline = gasoline;
}
/**
* Returns the color of the car
*/
public Color getColor() {
return color;
}
/**
* Repaints the car (i.e. changes its color)
*/
public void setColor(Color color) {
this.color = color;
}
/**
* Returns the age of the car
*/
public int getAge() {
return age;
}
/**
* Returns the number of doors of the car
*/
public int getDoors() {
return doors;
}
/**
* Returns the amount of gasoline in the tank
*/
public double getGasoline() {
return gasoline;
}
/**
* Fills the tank. The amount of gasoline cannot exceed
* the size of the tank. In that case, the tank will be
* filled to the maximum and the rest will run out in
* the sand.
*
* @param gasThe amount of gasoline to put in the tank
*/
public void setGasoline(double gas) {
if(gasolinegas = TANK_SIZE)
gasoline =gas;
else
gasoline = TANK_SIZE;
}
【java代码括号风格 java括号的用法】}
java软件开发的代码规范1、组织与风格
(1).关键词和操作符之间加适当的空格 。
(2).相对独立的程序块与块之间加空行
(3).较长的语句、表达式等要分成多行书写 。
(4).划分出的新行要进行适应的缩进 , 使排版整齐,语句可读 。
(5).长表达式要在低优先级操作符处划分新行,操作符放在新行之首 。
(6).循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分 。
(7).若函数或过程中的参数较长,则要进行适当的划分 。
(8).不允许把多个短语句写在一行中,即一行只写一条语句 。
(9).函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格 。
注:如果大家有兴趣可以到安安DIY创作室博客,有相关说明性的文章和解释 。
2、注解
Java 的语法与 C及为相似,那么 , 你知道 Java 的注释有几种吗?是两种?
// 注释一行
/* ...... */ 注释若干行
不完全对,除了以上两种之外,还有第三种 , 文档注释:
/** ...... */ 注释若干行,并写入 javadoc 文档
注释要简单明了 。
String userName = null; //用户名
边写代码边注释,修改代码同时修改相应的注释 , 以保证注释与代码的一致性 。
在必要的地方注释,注释量要适中 。注释的内容要清楚、明了,含义准确,防止注释二义性 。
保持注释与其描述的代码相邻,即注释的就近原则 。
对代码的注释应放在其上方相邻位置,不可放在下面 。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释应放在此域的右方;
同一结构中不同域的注释要对齐 。
变量、常量的注释应放在其上方相邻位置或右方 。
全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明 。
在每个源文件的头部要有必要的注释信息 , 包括:文件名;版本号;作者;生成日期;模块功能描述(如功能、主要算法、内部各部分之间的关系、该文件与其它文件关系等);主要函数或过程清单及本文件历史修改记录等 。
/**
* Copy Right Information : Neusoft IIT
* Project : eTrain
* JDK version used : jdk1.3.1
* Comments : config path
* Version : 1.01
* Modification history :2003.5.1
* Sr Date Modified By WhyWhat is modified
* 1. 2003.5.2 Kevin Gao new
**/
在每个函数或过程的前面要有必要的注释信息,包括:函数或过程名称;功能描述;输入、输出及返回值说明;调用关系及被调用关系说明等
/**
* Description :checkout 提款
* @param Hashtable cart info
* @param OrderBean order info
* @return String
*/
public String checkout(Hashtable htCart,
OrderBean orderBean)
throws Exception{
}
javadoc注释标签语法
@author 对类的说明 标明开发该类模块的作者
@version 对类的说明 标明该类模块的版本
@see 对类、属性、方法的说明 参考转向,也就是相关主题
@param 对方法的说明 对方法中某参数的说明
@return 对方法的说明 对方法返回值的说明
@exception 对方法的说明 对方法可能抛出的异常进行说明
3、命名规范
定义这个规范的目的是让项目中所有的文档都看起来像一个人写的 , 增加可读性,减少项目组中因为换人而带来的损失 。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)较短的单词可通过去掉元音形成缩写;要不然最后自己写的代码自己都看不懂了,那可不行 。
较长的单词可取单词的头几发符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级 。
使用匈牙利表示法
Package 的命名
Package 的名字应该都是由一个小写单词组成 。
package com.neu.util
Class 的命名
Class 的名字必须由大写字母开头而其他字母都小写的单词组成,对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母 。
public class ThisAClassName{}
Class 变量的命名
变量的名字必须用一个小写字母开头 。后面的单词用大写字母开头
userName , thisAClassMethod
Static Final 变量的命名
static Final 变量的名字应该都大写,并且指出完整含义 。
/**
*DBConfig PATH
**/
public static final String
DB_CONFIG_FILE_PATH =com.neu.etrain.dbconfig;
参数的命名
参数的名字必须和变量的命名规范一致 。
数组的命名
数组应该总是用下面的方式来命名:
byte[] buffer;
而不是:
byte buffer[];
方法的参数
使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
SetCounter(int size){
this.size = size;
}
4、文件样式
所有的 Java(*.java) 文件都必须遵守如下的样式规则:
版权信息
版权信息必须在 java 文件的开头,比如:
/*
* Copyright ? 2000 Shanghai XXX Co. Ltd.
* All right reserved.
*/
其他不需要出现在 javadoc 的信息也可以包含在这里 。
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 的 。
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 定义的成
员变量如果名字含义明确的话,可以没有注释 。
存取方法
接下来是类变量的存取的方法 。它只是简单的用来将类的变量赋值获取值的话,可以简单的
写在一行上 。
/**
* 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; }
其它的方法不要写在一行上
构造函数
接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面) 。
访问类型 (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());
}
}
类方法
下面开始写类的方法:
/**
* 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 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);
}
toString 方法
无论如何,每一个类都应该定义 toString 方法:
public
String toString() {
String retval = CounterSet: ;
for (int i = 0; idata.length(); i) {
retval= data.bytes.toString();
retval= data.packets.toString();
}
return retval;
}
}
main 方法
如果main(String[]) 方法已经定义了, 那么它应该写在类的底部.
5、代码可读性
避免使用不易理解的数字 , 用有意义的标识来替代 。
不要使用难懂的技巧性很高的语句 。
源程序中关系较为紧密的代码应尽可能相邻 。
6、代码性能
在写代码的时候,从头至尾都应该考虑性能问题 。这不是说时间都应该浪费在优化代码上,而是我们时刻应该提醒自己要注意代码的效率 。比如:如果没有时间来实现一个高效的算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她 。
不是所有的人都同意在写代码的时候应该优化性能这个观点的,他们认为性能优化的问题应该在项目的后期再去考虑,也就是在程序的轮廓已经实现了以后 。
不必要的对象构造
不要在循环中构造和释放对象
使用 StringBuffer 对象
在处理 String 的时候要尽量使用 StringBuffer 类,StringBuffer 类是构成 String 类的基础 。
String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口 。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象 。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用StringBuffer 对象和她的 append() 方法 。如果我们用 String 对象代替StringBuffer 对象的话 , 会花费许多不必要的创建和释放对象的 CPU 时间 。大家可以来安安DIY创作室一起讨论 。
避免太多的使用 synchronized 关键字避免不必要的使用关键字 synchronized , 应该在必要的时候再使用她,这是一个避免死锁的好方法 。
7、编程技巧
byte 数组转换到 characters
为了将 byte 数组转换到 characters,你可以这么做:
Hello world!.getBytes();
Utility 类
Utility 类(仅仅提供方法的类)应该被申明为抽象的来防止被继承或被初始化 。
初始化
下面的代码是一种很好的初始化数组的方法:
objectArguments = new Object[] { arguments };
枚举类型
JAVA 对枚举的支持不好,但是下面的代码是一种很有用的模板:
class Colour {
public static final Colour BLACK = new Colour(0, 0, 0);
public static final Colour RED = new Colour(0xFF, 0, 0);
public static final Colour GREEN = new Colour(0, 0xFF, 0);
public static final Colour BLUE = new Colour(0, 0, 0xFF);
public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);
}
这种技术实现了RED, GREEN, BLUE 等可以象其他语言的枚举类型一样使用的常量 。
他们可以用 '==' 操作符来比较 。
但是这样使用有一个缺陷:如果一个用户用这样的方法来创建颜色 BLACK new Colour(0,0,0)
那么这就是另外一个对象,'=='操作符就会产生错误 。她的 equal() 方法仍然有效 。由于这个原因,这个技术的缺陷最好注明在文档中 , 或者只在自己的包中使用 。
8、编写格式
代码样式
代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车 换行)
文档化
必须用 javadoc 来为类生成文档 。不仅因为它是标准,这也是被各种 java 编译器都认可的方法 。使用 @author 标记是不被推荐的,因为代码不应该是被个人拥有的 。
缩进
缩进应该是每行2个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.如果你使用 UltrEdit 作为你的 Java 源代码编辑器的话 , 你可以通过如下操作来禁止保存Tab字符, 方法是通过 UltrEdit中先设定 Tab 使用的长度室2个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格 。
页宽
页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符.
{} 对
{} 中的语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的:
if (i0) { i}; // 错误, { 和 } 在同一行
if (i0) {
i
}; // 正确, { 单独作为一行
} 语句永远单独作为一行.如果 } 语句应该缩进到与其相对应的 { 那一行相对齐的位置 。
括号
左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格. 下面的例子说明括号和空格的错误及正确使用:
CallProc( AParameter ); // 错误
CallProc(AParameter); // 正确
不要在语句中使用无意义的括号. 括号只应该为达到某种目的而出现在源代码中 。下面的例子说明错误和正确的用法:
if ((I) = 42) { // 错误 - 括号毫无意义
if (I == 42) or (J == 42) then // 正确 - 的确需要括号
9、代码编译
1.编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失 。
2.同一项目组内 , 最好使用相同的编辑器,并使用相同的设置选项 。
3.合理地设计软件系统目录,方便开发人员使用 。
4.打开编译器的所有告警开关对程序进行编译 。
5.在同一项目组或产品组中,要统一编译开关选项 。
6.使用工具软件(如Visual SourceSafe)对代码版本进行维护 。如果大家有不明白的可以到安安DIY创作室留言 。
10、可移植性
Borland Jbulider 不喜欢 synchronized 这个关键字,如果你的断点设在这些关键字的作用域内的话,调试的时候你会发现的断点会到处乱跳,让你不知所措 。除非必须,尽量不要使用 。
换行
如果需要换行的话,尽量用 println 来代替在字符串中使用\n 。
你不要这样:
System.out.print(Hello,world!\n);
要这样:
System.out.println(Hello,world!);
或者你构造一个带换行符的字符串 , 至少要象这样:
String newline = System.getProperty(line.separator);
System.out.println(Hello worldnewline);
PrintStream
PrintStream 已经被不赞成(deprecated)使用,用 PrintWrite 来代替它 。
关于java代码括号风格和java括号的用法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读