2016-06-24 26 views
2

這更多的是針對Android的最佳實踐/性能相關問題(我明白這可能是一個普通的討論,但我希望它可以考慮到Android的縮小範圍環境)。決定實用程序類還是從基本活動繼承

可以說我有一個方法(它檢查條件並將用戶重定向到各種活動)。這個方法被很多類使用。

我無法決定是否將此方法添加到工具類中,使其成爲靜態並從需要它的每個活動中調用它。

或者

創建一個基地活動,在裏面添加的方法,並且需要使用此方法的任何活動,從基底活動繼承。 (假設我們在這種特殊情況下繼承了單一繼承)。

想法?

編輯 這些是我檢查過的相關SO帖子。無法形成基於這些

Utility classes are evil?

If a "Utilities" class is evil, where do I put my generic code?

+0

什麼,我會建議是調用工具做你的工作,然後創建您的活動的回調方法對結果做出反應,你的實用方法不應該知道的UI元素 –

+0

@SarthakMittal謝謝。但是我有興趣知道什麼幫助你做出這個決定,而不是使用一個基本活動,移動那裏的方法並通過使用這個方法的任何活動繼承這個類? – RmK

+1

我通常保留繼承過程作爲最後的手段,因爲我們只能擴展一個類,如果只有一些類會使用該方法,最好使用接口,但是,如果您的所有活動都需要這些方法,那麼它是正常的創建基類 –

回答

1

的決定,也將在需要時注入的構造方法的類的可能性。當你使用這種方法時,你可以很容易地在接口後面嘲笑這個類,並且可以用模擬來創建測試。

作爲例如一些僞代碼:

Utility類:

public class Utility implements IUtility { 
    @Override 
    public void add() { ... } 

    @Override 
    public void remove() { ... } 
} 

Utility使用類:

public class UtilityUsingClass { 
    private IUtility utility; 
    public UtilityUsingClass(IUtility utility) { 
     this.utility = utility; 
    } 

    public void myMethod() { 
     // Use Utility class 
     utility.add(); 
     ... 
    } 
} 

在測試中它可以是這樣的:

@Test 
public void testMyMethod() { 
    UtilityUsingClass testClass = new UtilityUsingClass(new UtilityMock()); 
    testClass.myMethod(); 

    // assert stuff 
} 

UtilityMock

public class UtilityMock implements IUtility { 
    @Override 
    public void add() { // Implements mock logic ... } 

    @Override 
    public void remove() { // Implements mock logic ... } 
} 
+0

謝謝。我不確定我是否遵循你的意思。 – RmK

+0

太棒了。這澄清了你的答案。我真正感興趣的是 - 什麼幫助你做出這個決定,而不是使用一個基類,移動那裏的方法和任何繼承這個基類的方法的子類? – RmK

+1

有許多原因在這個網站上列出(http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-java-oops-design.html)也有很多原因測試和更改注入類非常好使用 –