2010-03-11 51 views
3

這裏我的第一個問題很溫和。使用私有屬性複製構造函數

我想爲下面的代碼參數:

public class Example { 
    private String name; 
    private int age; 

    ... 

    // copy constructor here 
    public Example(Example e) { 
     this.name = e.name; // accessing a private attribute of an instance 
     this.age = e.age; 
    } 

    ... 
} 

我相信這打破傳遞給拷貝構造函數實例的模塊化。 這就是我認爲是正確的:

public class Example { 
    private String name; 
    private int age; 

    ... 
    // copy constructor here 
    public Example(Example e) { 
     this.setName(e.getName()); 
     this.setAge(e.getAge()); 
    } 

    ... 
} 

一個朋友露出的觀點正確的觀點,他說,在副本中構建我們應該儘可能快地創建對象。而添加getter/setter方法會導致不必要的開銷。

我站在十字路口。你能說出一些光明嗎?

+0

非常適合第一個問題。 – John 2010-03-11 18:26:09

回答

1

訪問是基於類的,而不是基於對象的。

使會員成爲私人的基本原理是其他類不應該知道定義良好的API之外的實現細節,以便使系統的其餘部分能夠容忍實現的變化。但是,複製構造函數不是「系統的第一個」 - 它是你自己的類。

+0

嘿DVK,這是什麼意思「系統的第一個」? 我確實瞭解你的觀點,並且我從編程老師那裏得到了同樣的答案。 – 2010-03-12 11:40:11

+0

系統的其餘部分 - 任何班級以外的代碼/類。 – DVK 2010-03-12 15:03:26

1

第一個示例不復制實例的私有屬性,因爲它們是同一類的bot實例。但是,如果添加訪問方法/屬性,任何體面的編譯器都應該將它們優化爲簡單的「內聯」,在這種情況下,第二種方法是更乾淨的代碼(所有訪問都通過訪問函數進行),但兩種方法都應該結束我們同樣高效(可能相同)成員複製。

如果您確實希望複製構造函數高效,那麼較低級別的二進制副本將比成員副本更快。但顯着「更骯髒」。

一般而言,我更喜歡通過屬性/訪問器訪問所有成員字段,因爲它可以更好地封裝它們,允許您更改字段的底層實現/存儲,而無需更改訪問它的任何代碼,財產/訪問者本身。