java學習筆記--封裝的注意點

xiaopengyaonixi發表於2016-10-11

注意在進行封裝物件的時候,在一個類中不要編寫返回引用的訪問器。如下程式碼:

package com.handkoo.test;

import java.util.Date;

public class Demo {
	private Date myDate;
       
        public Demo() {

     }
    
     public Demo(Date date){
            this.myDate = date;
     }

	public Date getMyDate() {
		return myDate;
	}

	public void setMyDate(Date myDate) {
		this.myDate = myDate;
	}

}

這樣寫會破壞封裝性,造成很隱蔽的錯誤!

如果這樣寫:

public static void main(String[] args){
		Demo demo = new Demo(new Date());
		System.out.println("該物件初始化的myDate屬性值為:"+demo.getMyDate());
		
		Date date = demo.getMyDate();
		double tenYears = 10*365.25*24*60*60*1000;
		date.setTime(date.getTime()-(long)tenYears);
		
		System.out.println("此時物件的myDate值為:"+demo.getMyDate());
	}

結果很令人意外,兩次輸出的myDate屬性值並不一樣!

原來這是因為返回的引用導致的.

date和demo.myDate引用的是同一個物件。

所以,在返回物件的引用時,如果需要返回一個資料拷貝,最好返回一個物件的克隆。

package com.handkoo.test;

import java.util.Date;

public class Demo {
	private Date myDate;
	
	public Demo() {

	}
	
	public Demo(Date date){
		this.myDate = date;
	}

	public Date getMyDate() {
		return (Date) myDate.clone();
	}

	public void setMyDate(Date myDate) {
		this.myDate = myDate;
	}
	
	public static void main(String[] args){
		Demo demo = new Demo(new Date());
		System.out.println("該物件初始化的myDate屬性值為:"+demo.getMyDate());
		
		Date date = demo.getMyDate();
		double tenYears = 10*365.25*24*60*60*1000;
		date.setTime(date.getTime()-(long)tenYears);
		
		System.out.println("此時物件的myDate值為:"+demo.getMyDate());
	}

}

結果:



相關文章