針對What is your longest-held programming assumption that turned out to be incorrect?問題,錯誤的假設之一是:你能解釋一下關於封裝的東西嗎?
私有成員變量是 私有的實例,而不是 類。
(Link)
我沒聽清楚他在說什麼,任何人都可以解釋一下什麼是錯/右關於用一個例子?
針對What is your longest-held programming assumption that turned out to be incorrect?問題,錯誤的假設之一是:你能解釋一下關於封裝的東西嗎?
私有成員變量是 私有的實例,而不是 類。
(Link)
我沒聽清楚他在說什麼,任何人都可以解釋一下什麼是錯/右關於用一個例子?
public class Example {
private int a;
public int getOtherA(Example other) {
return other.a;
}
}
像這樣。正如你所看到的,私有不會保護實例成員不被另一個實例訪問。
順便說一句,只要你有點小心,這並不全是壞事。 如果private不像上面的例子那樣工作,編寫equals()和其他類似的方法會很麻煩。
因此,私人成員對於該類是私有的,並且一個實例可以訪問另一個實例的私有成員,對嗎? – 2009-08-31 13:42:06
是的,這是正確的。 – 2009-08-31 13:51:04
好的,非常感謝! – 2009-08-31 13:53:00
示例代碼(JAVA):
public class MutableInteger {
private int value;
// Lots of stuff goes here
public boolean equals(Object o) {
if(!(o instanceof MutableInteger)){ return false; }
MutableInteger other = (MutableInteger) o;
return this.value == other.value; // <------------
}
}
如果假設「私有成員變量是私有的實例」是正確的,該標線會導致編譯器錯誤,因爲other.value
領域是私人和部分與正在調用equals()
方法的對象不同。
但由於在Java中(和有知名度的概念大多數其他語言)private
能見度每級,訪問現場被允許在MutableInteger
的所有代碼,不相關被用來調用它什麼實例。
這裏是Michael Borgwardt's answer你當等效不能夠訪問其他對象的私有字段:
public class MutableInteger {
private int value;
// Lots of stuff goes here
public boolean equals(Object o) {
if(!(o instanceof MutableInteger)){ return false; }
MutableInteger other = (MutableInteger) o;
return other.valueEquals(this.value); // <------------
}
@Override // This method would probably also be declared in an interface
public boolean valueEquals(int oValue) {
return this.value == oValue;
}
}
如今這是熟悉的Ruby程序員,但我已經在Java中一直這樣做一會兒。我不想依賴訪問另一個對象的私有字段。請記住,另一個對象可能屬於一個子類,它可以將值存儲在不同的對象字段中,或存儲在文件或數據庫等中。
這與封裝有關嗎? – p4bl0 2009-08-31 13:41:31
私有可見性是如何在諸如Java,C++和C#語言中實現封裝的。# – 2009-08-31 13:43:44
@ p4bl0封裝和變量作用域如何相關?相當根本。 – meagar 2010-10-07 16:38:39