簡體   English   中英

Java中的靜態構造函數方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM