Java program coding specification
(Source: http://www.ibm.com.cn)
Li Xiaomin www.yway.com Software Engineer December 2000
All procedures development brochures contain various rules. Some customary free proceeders may not be adapted to these rules, but these rules are required in the case of working with multiple developers. This is not only for development efficiency, but also for later maintenance considerations.
Naming Specifications Definition The purpose of this specification is to make all documents in the project look like a person written, increase readability, and reduce the loss in the project group because of the loss. (These norms are not necessarily abolished, but must have a good readability)
The name of the name of Package should be composed of a lowercase word.
The name of the Class's named Class must be made by uppercase letters and other letters.
The name of the name variable of the Class variable must be started with a lowercase letter. The latter words begin with uppercase letters.
The name of the Static Final variable should be capitalized and point out the full meaning.
The name of the naming parameters of the parameters must be consistent with the naming specification of the variable.
The named array of arrays should always be named in the following way:
BYTE [] BUFFER
Instead:
BYTE BUFFER [];
The parameters of the method use meaningful parameters, if possible, use the same name as the field to assign value:
SetCounter (int size) {
THIS.SIZE = Size;
}
All Java file styles All Java (*. Java) files must comply with the following style rules.
Copyright Information The copyright information must be on the beginning of the Java file, such as:
/ **
* Copyright ® 2000 Shanghai XXX Co. Ltd.
* All right reserved.
* /
Others do not need to appear in Javadoc, can also be included here.
Package / Imports Package Row Before the IMPORT row, the standard package name in the Import is previously in the local package name and arranges in alphabetical order. If the IMPORT line contains different subdirectory in the same package, you should use * to process.
Package hotlava.net.stats;
Import java.io. *;
Import java.util.observable;
Import Hotlava.util.Application;
Here Java.IO. * is used instead of InputStream and OutputStream.
Class is next to the annotation of the class, usually used to interpret the class.
/ **
* A class representing a set of packet and byte counters
* It is observable to allow it to be watch, but only
* Reports Changs WHEN THE CURRENT SET IS Complete
* /
Next is a class definition, including extends and imports in different rows.
Public Class Counterset
Extends Observable
Implements Cloneable
Class Fields Next is a member variable of class:
/ **
* Packet Counters
* /
protected int [] packets;
Public member variables must generate a document (javadoc). Member variables defined by Proceted, Private and Package If the name meaning is clear, you can not comment.
Access method Next is a method of access to class variables. It is just simple to get values to assign values to the class variable, you can simply write on one line. / **
* Get the counter
* @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;}
Other methods don't write on a line
The constructor is next to the constructor, which should be written in an incremental manner (such as: writing more than the parameter). Access Type ("Public", "Private", etc.) and any "static", "firm" or "synchronized" should be written in one line, and the methods and parameters can be written separately, which makes the method and parameters easier to read.
public
Counterset (int size) {
THIS.SIZE = Size;
}
Cloning method If this class can be cloned, then the next step is Clone method:
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 ClonyNotSupportedException:" E.GetMessage ());
}
}
Class Method Next: Method for writing classes:
/ **
* Set the packet counter
* (Such as When Restoring from a database)
* /
Protected final
Void setArray (int [] r1, int [] r2, int [] R3, int [] R4)
Throws IllegalargumentException
{
//
// ensure the arrays area 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);
}
The TOSTRING method should define the toString method in any case:
public
String toString () {
String Retval = "Counterset:"; for (int i = 0; i RetVal = data.bytes.tostring (); Retval = data.packets.tostring (); } Return RetVal; } } Main method If the main (String []) method is already defined, it should be written at the bottom of the class. Code writing format Code style code should use UNIX's format, not Windows (such as: Enter the carriage return wrap) Documentation must use Javadoc to generate a document for class. Not only because it is standard, this is also a method recognized by various Java compilers. Using the @Author tag is not recommended because the code should not be owned by the individual. The indental indentation should be 2 space per line. Do not save the Tab character in the source file. Tab characters will be extended to different widths because the user settings are used in different source code management tools. If you use Ultredit as If your Java source editor, you can prohibit saving Tab characters by using the following operations, using the length of the length of the tab used in the ULTREDIT, then use the Format | Tabs to Spaces menu to convert TAB to spaces . Page width width should be set to 80 characters. Source code will not exceed this width and causing unable to display, but this setting can also be flexible. In any case, the long statement should be in a comma or one action After the folding. After a statement is folded, 2 characters should be indented more than the original statement. {} The statement in {} should be a row alone. For example, the first line below is wrong, the second line is correct: IF (i> 0) {i }; // error, {and} in the same line IF (i> 0) { i }; // correct, {separate as a line } The statement is always separate as a line. If the} statement should be indented to the {that row relatively aligned with it. There should be a space between the parentheses left parentheses and the latter characters. Similarly, there should be no space between the right brackets and the previous characters. The following example shows the incorrect of parentheses and spaces and correct usage: CallProc (APARAMETER); // Error CallProc (APARAMETER); // Do not use meaningless parentheses in the statement. Braces should only be in the source code to achieve some purpose. The following example illustrates errors and correct usage: if ((i) = 42) {// error - parentheses meaningless if (i == 42) or (j == 42) THEN // correct - indeed parentheses Program writing specification EXIT () EXIT In addition to being called in main, other places should not be called. Because this does not give any code code opportunities to intercept exit. A similar background service ground program should not be exited because a library module determines to exit. An abnormally declared error should throw a runtimeException or derived exception. The top () function of the top layer should intercept all exceptions and print (or record it in the log) on the screen. Garbage collection Java uses mature background garbage collection techniques instead of reference count. But this will result in a problem: You must work after the instance of the object is used. For example, a PREL programmer may write: ... { FileOutputStream Fos = New FileoutputStream (Projectfile); Project.save (FOS, "Ide Project File"; } ... Unless the output stream is turned off, it is not a reference to the program language, such as Java, is a clearing work of the variable. Must be written as follows: FileOutputStream Fos = New FileoutPutStream (ProjectFile); Project.save (FOS, "Ide Project File"; Fos.close (); The following is a useful method: Implements Cloneable public Object clone () { Try { THISCLASS OBJ = (thisclass) super.clone (); Obj.field1 = (int []) Field1.clone (); Obj.field2 = field2; Return Obj; } catch (clonenotsupportedexception e) { Throw New Internalerror ("Unexpected ClonyNotSupportedException:" E.GetMessage ()); } } The Final class is absolutely not to define the class as final (unless the program frame requirements) if a class is not ready to be inherited, not to define her as Final. This is because no one can guarantee that it will not be inherited because of what reason. Most of the members variables of the members of the access class should be defined as protected to prevent inheritance classes. Note, use "int [] packets" instead of "int packets []", the latter is never used. Public void setpackets (int [] packets) {this.packets = packets;} Counterset (int size) { THIS.SIZE = Size; } Program skill Byte array transition to Characters In order to convert the BYTE array to Characters, you can do this: "Hello World!". Gettes (); The Utility class UTILITY class (class only provides a class) should be stated to abstract to prevent inheritance or initialization. Initializing the following code is a good method of initialization array: Objectarguments = new object [] {arguments} Enumeration Type Java is not good for enumeration, but the following code is a useful template: Class color { Public Static Final Colour Black = New Colour (0, 0, 0); Public Static Final Colour Red = New Colour (0xFF, 0, 0); Public Static Final Color Green = New Colour (0, 0xFF, 0); Public Static Final Color Blue = New Colour (0, 0, 0xFF); Public Static Final Colour White = New Colour (0xFF, 0xFF, 0xFF); } This technology implements constants that can be used like the types of enumerations such as other languages. They can compare with '==' operators. But this is used to use a defect: if a user uses such a method to create a color Black New Colour, this is another object, the '==' operator generates an error. Her equal () method is still valid. For this reason, the defect of this technology is best to indicate in the document, or only in your own package. Swing Avoid using AWT components Mixing Use the AWT and SWING components If you want to mix the AWT components and Swing components, use it. In fact, try not to mix them up. Scrolling AWT component AWT components must not use JScrollPane classes to implement scrolling. When scrolling the AWT component, you must use the AWT SCROLLPANE component to be implemented. Avoid using AWT components to do so as much as possible in the InternalFrame component, or there will be unpredictable consequences. Z-Order issues The AWT component is always displayed on the Swing component. Be careful when using the POP-UP menu containing the AWT component, try not to use it like this. debugging Debugging is a very important part of software development, exists in various parts of the software lifecycle. Debug can be opened with configuration, the key is the most basic. A very commonly used debugging method is to use a PrintStream class member, when not defined the trial flow, the class wants to define a DEBUG method to set the stream of debugging. performance When writing code, you should consider performance issues from head until tails. This is not to say that time should be wasted on the optimization code, but we always remind yourself to pay attention to the efficiency of the code. For example, if there is no time to implement an efficient algorithm, then we should record in the document so that you will come again in the future. Not all people agree to optimize the performance of this view when writing code, and they think that performance optimization should be considered in the later stage of the project, that is, after the outline of the program has been implemented. Unnecessary object structure Do not construct and release objects in the loop Using the StringBuffer object When processing String, try to use the StringBuffer class as possible, and the StringBuffer class is the basis for constituting the String class. The String class encapsulates the StringBuffer class, (at the expense of more time) provides a secure interface to developers. When we are constructing a string, we should use StringBuffer to implement most of the work, and convert the StringBuffer object to the required String object when the work is completed. For example, if there is a string that must be constantly adding a lot of characters to complete the construct, we should use the StringBuffer object and her append () method. If we use the String object instead of the StringBuffer object, you will spend a lot of unnecessary CPU time to create and release the object. Avoid too much use synchronized keyword to avoid unnecessary use of keyword synchronized, should use her when necessary, this is a good way to avoid deadlocks. Portability Borland Jbulider does not like synchronized this keyword. If your breakpoint is located in the scope of these keywords, you will find the breakpoint when you debug, let you do it. Minimize not to use unless you must If you need to wrap, try to use PrintLn to use "/ n" in a string. You don't want this: system.out.print ("Hello, World! / N"); you should: system.out.println ("Hello, World!"); Or you construct a string with changing lines, at least This is like this: string newline = system.getProperty ("line.separator"); System.out.Println ("Hello World"; PrintStream PrintStream has been used without admission, replacing her with printwrite. Reference Find other information about the Thread class and Java 2 platforms, standard editions, API specifications.