2016-12-15 64 views
1

我學習Java並想知道下面的類初始化實現是否有任何區別。類初始化的兩種方式有什麼區別?

[選項1]

public class LaunchHandler implements SomeItf{ 

    public static LaunchHandler create(ArrayList<String> params){ 
     LaunchHandler self = new LaunchHandler(params); 
     return self; 
    } 

    private LaunchHandler(ArrayList<String> params){ 
     mParams = params; 
    } 
} 

所以我稱其爲:

SomeItf launch = LaunchHandler.create(params); 

[選項2]

public class LaunchHandler implements SomeItf{ 

    public LaunchHandler(ArrayList<String> params){ 
     mParams = params; 
    } 
} 

我稱其爲:

SomeItf launch = new LaunchHandler(params); 

對於我來說這兩個選項都是一樣的,但是第一個選項我在大項目中看到了。

第一選項的優點是什麼?

有人能傳播光嗎?

+2

你必須有一切的工廠方法。 [企業質量代碼,在這裏。](https://github.com/EnterpriseQualityCoding/FizzBu​​zzEnterpriseEdition) –

+0

其他重複:http://stackoverflow.com/questions/194496/static-factory-methods-vs-instance-normal-構造函數http://softwareengineering.stackexchange.com/questions/240351/using-a-simple-static-factory-vs-instantiating-directly-new-thing-vs-factor – assylias

回答

2

由於Sotirios Delimanolis在評論中寫道,第一個是靜態工廠模式。使用這種模式你的類不能被擴展,因爲沒有訪問構造函數。另外,靜態工廠模式可以用於其他方式,例如,控制創建的實例的數量,或者返回不同類的實例(通常應用相同的接口)。

一個私人用例是着名的Singleton模式。 另一個是對象池。

+0

所以,據我瞭解你的最佳做法是使用工廠模式,因爲它給了我額外的選擇,對吧? – snaggs

+0

@snaggs是的,它鼓勵針對接口而不是特定類進行編碼(更好的抽象),這會使您在實現和修改時有更好的靈活性,您可能希望在此方法中應用這些靈活性。在[有效的java](http://www.informit.com/articles/article.aspx?p=1216151)中鼓勵使用靜態工廠 - 這是一本強烈建議任何Java程序員使用的書!如果需要接口,則爲 – alfasin

+0

是。否則不。創建一個僅用於創建界面的界面就是噪音。看看這個:http://stackoverflow.com/questions/956011/useless-interfaces – davidxxx

相關問題