在 Java 中使用一個(gè) getter 和 setter 符號(hào),為對(duì)象的屬性提供一致的接口已成為一種標(biāo)準(zhǔn)實(shí)踐。我們?cè)?Java 中不進(jìn)行以下操作是有原因的:
public String fullName;
實(shí)際上,上述代碼在類(lèi)及類(lèi)的實(shí)現(xiàn)者之間創(chuàng)建了一個(gè)接口(或合同),該接口不允許我們?cè)陬?lèi)的實(shí)例上訪(fǎng)問(wèn) fullName 屬性時(shí)更改返回結(jié)果的基礎(chǔ)實(shí)現(xiàn)dota流浪劍客和水晶室女等英雄初期裝備攻略。因此,如果有人使用 Java 代碼訪(fǎng)問(wèn)數(shù)碼 fullName 屬性:
blah = obj.fullName;
或者設(shè)置 fullName 屬性:
obj.fullName = "blah";
那么,在 Java 中沒(méi)有辦法更改獲取或設(shè)置 fullName
屬性的行為。如果類(lèi)的設(shè)計(jì)者想要更改獲取或設(shè)置屬性的基礎(chǔ)行為,他們必須更改類(lèi)實(shí)現(xiàn)者與類(lèi)進(jìn)行交互的方式。這顯然不是理想之選,所以在 Java
中我們通常使用 get 和 set 函數(shù)隱藏屬性。Java 語(yǔ)言尚無(wú) Java 屬性,所以我們使用多種方法來(lái)隱藏實(shí)現(xiàn)。因此,我們的 Java
類(lèi)將是:
private String fullName;
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
這允許類(lèi)設(shè)計(jì)者更改獲取和設(shè)置 fullName 屬性的行為,同時(shí)不更改外部接口。
在 Flex 中,通常不必在對(duì)象上創(chuàng)建包裝 getter 和 setting 函數(shù),因?yàn)?ActionScript 支持屬性。這意味著,您通常僅可以創(chuàng)建如下的公共屬性:
public var fullName:String;
如果獲取或設(shè)置 fullName 屬性的內(nèi)部實(shí)現(xiàn)需要更改,那么可以改編類(lèi),以具備 getter 和 setter 函數(shù),而無(wú)需更改類(lèi)的外部接口:
private var _fullName:String;
public function get fullName():String {
return _fullName;
}
public function set fullName(_fullName:String):void {
this._fullName = _fullName;
}
對(duì)于類(lèi)實(shí)現(xiàn)者來(lái)說(shuō),屬性 fullName 還可以通過(guò)常規(guī)符號(hào)獲取和設(shè)置:
// getters
blah = obj.fullName;
blah = obj['fullName'];
// setters
obj.fullName = "blah";
obj['fullName'] = "blah";
獲取或設(shè)置屬性將調(diào)用 getter 和 setter 函數(shù),而不是直接訪(fǎng)問(wèn)屬性。這支持對(duì)象接口的一致性,即便獲取和設(shè)置屬性的基礎(chǔ)實(shí)現(xiàn)發(fā)生了更改。這同樣支持屬性發(fā)生更改時(shí)類(lèi)分配事件(這就是數(shù)據(jù)綁定是如何在 Flex 內(nèi)部工作的)。
我注意到很多 Java 開(kāi)發(fā)人員都對(duì) ActionScript 類(lèi)上的公共屬性非常警惕。不必!ActionScript
支持真正的屬性,因此您不再需要屬性 getter 和 setter,除非您正在進(jìn)行一些非同尋常的操作。而且,您可以切換到 getter 和
setter,而無(wú)須更改對(duì)象的接口。
posted on 2010-11-06 15:09
墻頭草 閱讀(733)
評(píng)論(0) 編輯 收藏