[英]Static constructor methods in Java
我不太確定該怎么稱呼它,因為“靜態構造函數”似乎傳達了靜態初始化程序塊的概念,但我的問題與樣式有關。
假設我有一個類武器 ,它有你的標准構造函數來初始化武器的統計數據。 這很好,但有時候我想隨機生成武器。 我可以創建一個名為FromRandom的靜態方法,它創建一個帶有隨機統計數據的新武器並返回它。 這樣我可以做這樣的事情:
Weapon randWeapon = Weapon.FromRandom();
對此有何共識? 這是可接受的代碼嗎?
給一個類靜態方法,通過返回它們所在類的實例來提供更多控制和優雅,這是完全可以接受的代碼。 這實際上稱為工廠方法模式,並且在創建類的實例時更好地控制時經常使用。
基本上,你有靜態方法調用其中一個類構造函數,在記錄對象的創建,將其添加到集合,對其執行進一步操作等方面做任何需要做的事情,然后返回創建的對象,因此該方法最終像普通構造函數一樣使用。 :d
我希望有多個構造函數,參數確定如何創建對象。 如果只有兩個選項,請使用布爾值(您可以保留默認版本並將其鏈接)。 如果有很多,請使用enum參數。
但是,我不一定認為你的代碼錯了。 番石榴使用類似的風格(見Lists
)。 但是,請注意它返回另一個類( List
)的實例,並且它本身沒有構造函數。
這是一種眾所周知的設計模式(在某種程度上),稱為抽象工廠模式,請參閱: http : //en.wikipedia.org/wiki/Abstract_factory_pattern
一般來說,這很好,並為您提供一些代碼優雅。 但我建議這只適用於工廠類。 為什么? 讓我們考慮你的例子
Weapon weapon = Weapon.create();
如果我有一個Weapon
的子類,例如Pistol
的靜態方法類似於前面你可以傳遞一個參數(例如子彈大小),那么你可能會做
Weapon randWeapon = Pistol.create("9mm");
但你可能會錯誤地做
Weapon randWeapon = Pistol.create();
它不會創建Pistol
,而是父類的實例。 這是期望的嗎? 不確定。 會更糟嗎? 好吧,想想在Pistol
類中定義create
方法的可能性
public static Pistol create(String ... args){...}
嚇跑,不是嗎?
所以,如果一個人不想創建一個工廠類,解決方案就是讓這個類成為final
,但我通常建議人們不要創建最終的類(考慮模擬的問題)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.