2013-08-05 129 views
2

我的一般問題是何時將參數傳遞給構造函數,以及何時將其傳遞給類的 方法。 通常,對象是「數據」+「作用於數據的方法」。何時使用構造函數以及何時傳入參數

我有幾個選項來設計一個名爲DFS的類。以下哪個例子最適合定義?

選項1:在構造函數中傳遞的圖,函數中的源。 Adv:相同的DFS對象將被重用於不同的源。

public class DFS { 
    Graph g; 
    public DFS(Graph g) { 
    this.g = g; 
    } 

    public void doDfs(int source) { 
    // dfs computation 
    } 
} 

選項2:構造與2個PARAMS和沒有多態性 Disadv:對於每個新的源需要構建新的對象。

public class DFS { 
    Graph g; 
    int source; 

    public DFS(Graph g, int source) { 
     this.g = g; 
     this.source = source; 
    } 

    public void doDfs() { 
     // dfs computation 
    } 
} 

方案3:過載構造 進階:解決我們的所有用例。 Dis:多態性代價高昂。

public class DFS { 
    Graph g; 
    int source; 

    public DFS(Graph g) { 
    this.g = g; 
    } 

    public DFS(Graph g, int source) { 
    this.g = g; 
    this.source = source; 
    } 

    public void doDfs() { 
     doDfs(source); 
    } 

    public void doDfs(int source) { 
    // dfs computation 
    } 
} 

方案4:沒有構造

public class DFS { 

    DFS() { } 

    public void doDFS(Graph g, int source) { 
     this.g = g; 
     this.source = source; 
     // dfs computation 
    } 
} 
+0

看看http://stackoverflow.com/questions/18027135 –

+0

你是什麼意思的「多態性」?我在這裏沒有看到任何多態性,也沒有看到它可能是相關的。 –

回答

2

如果您有與類的操作/定義關聯的東西,那麼它意味着作爲構造函數來進行傳遞。這也意味着,它將非常希望將它作爲immutable。例如:

public class DFS { 
    final Graph g; 
    public DFS(Graph g) { 
    this.g = g; 
    } 

    public void doDfs(int source) { 
    // dfs computation 
    } 
} 

在這裏,你知道類DFS包含多種方法(每個與自己的算法),找到圖形gDFS。在這種情況下,您知道g是不可變的,並且在每次調用方法時都會很痛苦,因此更好地將其作爲構造函數參數。一些優點:

  1. 每個方法調用都沒有多餘的參數。
  2. 如果你想做一些內部緩存,你可以這樣做。這適用於所有與已知實體有關的信息:g
  3. 線程安全,沒有顯式鎖定。你會需要它與setters。

總之,當你知道某些事情不會改變時,就把它作爲類的定義,把它作爲構造函數的參數。有使用這些實例變量的方法。使用Setters,當你知道什麼可以改變。

0

這是一個邏輯問題。當你設計你的類時,這個類的對象需要特定的數據纔是有效的,那麼數據必須在構造函數中提供。您還應該通過使用assert來檢查對象是否已實際通過。

但你可以選擇來設計你的課程,以便稍後添加數據。這取決於你打算如何使用你的班級 - 你應該爲你的班級的用戶設計班級。

順便說一句,你在你的帖子中評論說「多態現象代價高昂」。不,如果多態性能爲你完成工作,那麼它並不昂貴。這也取決於你的意思是什麼樣的多態性。

0

個人而言,我更喜歡選項4.沒有構造函數或最小構造函數使得使用單元測試來測試類變得更容易。

另外在較大的項目中,我更喜歡創建只包含參數的新類,然後將這樣的類用作參數。如果大量傳遞相同的參數,則可以在不更改所有方法的情況下稍後進行更改。

相關問題