靜態方法 例項方法 構造器

2021-08-08 16:17:39 字數 3443 閱讀 1482

有乙個randomintgenerator 類,產生隨機的int型別的整數。如下所示:

public

class

randomintgenerator

}

這個生成器接收最大值和最小值兩個引數並且生成介於兩者之間的隨機數。注意到兩個屬性min和max被final修飾,所以必須初始化它們。可以在定義它們時就初始化或者通過構造器來初始化。通過構造器初始如下:

public randomintgenerator(iint min, int

max)

現在,我們要提供給這樣乙個功能,客戶端僅設定乙個最小值然後產生乙個介於此值和integer.max_value之間的整數。所以我們新增了第二個構造器:

public

randomintgenerator(int min)

到目前為止,一切正常。但是,我們同樣要提供乙個構造器設定乙個最大值,然後產生乙個介於integer.min_value和最大值的整數。我們新增第三個構造器如下:

public

randomintgenerator(int max)

如果你這樣做了,將會出現編譯錯誤:duplicate method randomintgenerator(int) in type randomintgenerator。那裡出錯了?毫無疑問,問題在於構造器沒有名字。因此,乙個類僅有乙個特定方法簽名的構造器。同樣的,你不能定義方法簽名相同的(返回值、名稱、引數型別及個數均相同)兩個方法。這就是為什麼當我們試著新增構造器randomintgenerator(int max) 時,會得到上述的編譯錯誤,原因是我們已經有乙個構造器 randomintgenerator(int min)。

像這樣的情況我們該如何處理呢?幸好有其他方式可以使用:靜態工廠方法,通過使用簡單的公共靜態方法返回乙個類的例項。你可能在無意識中已經使用過這種技術。你有沒有寫過boolean.valueof?,就像下面這樣:

public

static boolean valueif(boolean b)

將靜態工廠應用到randomintgenerator類中,得到

public

class

randomintgenerator

public

static randomintgenerator between(int max, int min)

public

static randomintgenerator between(int max)

public

static randomintgenerator between(int min)

public

intnext()

}

注意到構造器被private修飾確保類僅能通過靜態工廠方法來初始化。並且當你使用randomintgenerator.between(10,20)而不是new randomintgenerator(10,20)來產生整數時你的意圖被清晰的表達了。此外,任何類可以提供靜態工廠方法替代構造器。

靜態工廠的優點:

第乙個優點:靜態工廠方法擁有名字,這有兩個直接的好處:

1. 我們可以給靜態方法提供乙個有意義的名字

2. 我們可以給靜態方法提供引數型別、引數個數相同的幾個構造器,在傳統構造器中是不能這樣做的

第二個優點: 不像構造器,靜態工廠方法不需要每次在呼叫時建立乙個新的物件。當使用不可變類(immutable class)產生常量物件用於常用值且避免了不必要的重複物件是非常有用的。上面的列子boolean.valueof完美的表明了這一點。注意到這個靜態方法返回均為不可變boolean物件true或者false。

第三個優點:靜態工廠方法的返回物件的型別可以是返回型別的任意子型別。這使你隨意更改返回型別而不用擔心影響到客戶端**成為了可能。

記得剛開始的randomintgenerator類嗎?我們讓他複雜一點。假設我們現在想提供不僅能產生整型,而且能產生其他資料型別如string, double或者long的隨機生成器。這些生成器將有乙個next()方法返回乙個特定型別的隨機物件,所以我們可以先定義乙個介面如:

public

inte***ce randomgenerator

randomintgenerator的第乙個實現類如下:

class

randomintgenerator

implements

randomgenerator

public integer next()

}

string型別的生成器如:

class

randomstringgenerator

implements

randomgenerator

public string next()

}

public

final

class

randomgenerators

public

static

final randomintgeneratorgetintgenerator()

public

static

final randomgeneratorgetstringgenerator()

}

randomgenerators類成為了乙個不可例項化的工具類,它與靜態工廠方法沒有什麼區別。在同乙個包中,不同的生成器類可以高效的獲取和例項化這些類。但是,有意思的部分出現了。注意到這些方法僅返回randomgenerator 介面,這才是客戶端**真正需要的。如果它獲得乙個randomgenerator它就知道呼叫next()然後得到乙個隨機的整數。

假設下月我們編寫了乙個新的高效的整數生成器。只要讓這個新類實現了randomgenerator我們更換靜態方法中的返回型別,那麼所有客戶端**神奇的使用了新的實現。

靜態工廠方法:直接可以通過靜態方法來例項化乙個物件

public

class helloworldfactory

}helloworldfactory.getinstance();

建立helloworld物件直接可以呼叫getinstance方法來進行實現

例項工廠方法:先建立類物件,通過物件來呼叫建立例項物件的方法

public

class helloworldfactory

}helloworldfactory hellofactory = new helloworldfactory();

hellofactory.createhelloworld();

靜態方法和靜態構造方法

如你所知,合理運用靜態欄位和靜態方法能夠提公升應用程式的效能,下面我們再複習一下類中的靜態成員 字段 方法 本文將涉及到靜態 構造方法等概念ok,我們先動手然後再剖析 新建乙個類test.cs public class test 用csc編譯一下 csc t library test.cs ok,讓...

例項方法 靜態方法 類方法

首先新建乙個日期date類,屬性為年,月,日,tomorrow 是例項方法,這個最常見,比較簡單,例項方法的第乙個引數是例項物件self 當我們傳入的年月日是2018 6 4這樣的形式,我們就需要先進行字串處理,在這裡使用了元組的拆包 這是最基本的方式,但是這樣寫會有乙個問題,每次傳參都需要進行字串...

類方法,例項方法,靜態方法

python 中的三種方法,有三種類方法,例項方法,靜態方法,這三種方法都在類中,區別在於呼叫的方式不同。例項物件能的呼叫這三種方法,類只能呼叫類方法和靜態方法。class foo object def init self,name self.name name deford func self 定...