养成良好的编程习惯,提高代码质量

上一篇 / 下一篇  2013-03-21 11:35:50 / 个人分类:其他

“不积跬步,无以至千里,不积小流,无以成江海”,程序员如何提高代码质量?我们不仅要知其然,还要知其所以然,我们要从点点滴滴的积累开始的。这篇帖子里记录了编程时的应该注意的一些细节,如有需要后续还会补充,希望通过不断的积累,提高编程质量。

可序列化接口Serializable

类实现Serializable接口的目的是为了可持久化,比如网络传输或本地存储,为系统的分布或异步部署提供先决支持条件。若没有序列化,现在我们熟悉的远程调用,对象数据库都不可能存在。

    序列化和反序列化是对应的,以下用代码描述实现了序列化接口Serializable的类在磁盘上的存储过程及反序列化,其在网络上的传输道理也是一样的。

 

Java代码  
  1. package org.iti.wxl.serializable;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. /** 
  6.  * 实现了Serializable的实体类 
  7.  * 
  8.  */  
  9. public class Person implements Serializable{  
  10.       
  11.     private static final long serialVersionUID = 6388172609871883630L;  
  12.     private String name;  
  13.   
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.   
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.   
  22. }  

 为模拟序列化的过程我们创建序列化工具类,如下:

Java代码  
  1. package org.iti.wxl.serializable;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.ObjectInput;  
  7. import java.io.ObjectInputStream;  
  8. import java.io.ObjectOutputStream;  
  9. import java.io.Serializable;  
  10.   
  11. public class SerializableUtils {  
  12.     private static String FILE_NAME="e:/obj.bin";  
  13.     //序列化数据保存到磁盘  
  14.     public static void writeObject(Serializable s){  
  15.         try {  
  16.             ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME));  
  17.             oos.writeObject(s);  
  18.             oos.close();  
  19.         } catch (IOException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.     }  
  23.   
  24.     //反序列化从磁盘读取数据  
  25.     public static Object readObject(){  
  26.         Object obj = null;  
  27.         try {  
  28.             ObjectInput input = new ObjectInputStream(new FileInputStream(FILE_NAME));  
  29.             obj = input.readObject();  
  30.             input.close();  
  31.         } catch (Exception e) {  
  32.             // TODO Auto-generated catch block  
  33.             e.printStackTrace();  
  34.         }  
  35.         return obj;  
  36.     }  
  37. }  

序列化保存数据到磁盘上

Java代码  
  1. package org.iti.wxl.serializable;  
  2. public class Producer {  
  3.     public static void main(String[] args) {  
  4.         Person p = new Person();  
  5.         p.setName("小明");  
  6.         // 序列化保存到磁盘上  
  7.         SerializableUtils.writeObject(p);  
  8.     }  
  9. }  

反序列化,从磁盘读取数据:

Java代码  
  1. package org.iti.wxl.serializable;  
  2.   
  3. public class Consumer {  
  4.     public static void main(String[] args) {  
  5.         //反序列化  
  6.         Person p =(Person)SerializableUtils.readObject();  
  7.         System.out.println(p.getName());  
  8.     }  
  9. }  

在反序列化时,若类的版本号serialVersionUID不一致,反序列化时会报一个InvalidClassexception异常,另外在反序列化时,类中的构造函数不会执行。

奇偶校验用偶校验,避免使用奇校验

JDK提供的奇偶校验代码模拟如下:

Java代码  
  1. public class Remainder {  
  2.        //dividend被除数,divisor除数  
  3.     public static int remainder(int dividend, int divisor) {  
  4.         return dividend - dividend/divisor*divisor;  
  5.     }  
  6. }  

 当使用取模运算“%”做奇偶校验时,JDK会依照以上公式进行运算,此时dividend为要校验的数,divisor=2我们发现当被除数为负数且为奇数时,余数为-1,如果我们的奇偶校验公式为i%2 =1 ? "奇数":"偶数";那么当i为负奇数时结果判断会错误,因此我们做奇偶校验时要用偶校验,即:i%2 == 0 ? "偶数":"奇数";

java中的引用问题

java中没有指针的概念,但我们要理解另一个名词“引用”。看下面的例子:

实体类

 

Java代码  
  1. public class IntString {  
  2.     private Integer no;  
  3.     private String str;  
  4.     public Integer getNo() {  
  5.         return no;  
  6.     }  
  7.     public void setNo(Integer no) {  
  8.         this.no = no;  
  9.     }  
  10.     public String getStr() {  
  11.         return str;  
  12.     }  
  13.     public void setStr(String str) {  
  14.         this.str = str;  
  15.     }  
  16.     @Override  
  17.     public String toString() {  
  18.         return "IntString [" + (no != null ? "no=" + no + ", " : "")  
  19.                 + (str != null ? "str=" + str : "") + "]";  
  20.     }  
  21. }  

测试类:

Java代码 

TAG:

 

评分:0

我来说两句