簡體   English   中英

同一Java類的兩個版本,每個版本具有不同的超類

[英]Two versions of the same Java class where each has a different superclass

用Java在編寫具有相同超類的兩個相同版本的兩個版本時最干凈的方法是什么? 最干凈的意思是DRY(最少重復的代碼)。 這兩個類將具有相似但不同的名稱和相同的代碼。

該應用程序是Android:類MyActivity擴展了ActionBarActivity。 類MyActivity34(用於API級別3/4)擴展了Activity,但具有與MyActivity相同的代碼。 我不想保留所有內容的兩個副本(在C ++中,我將為此使用預處理器)。 更改超類不是一種選擇。

謝謝。

注意:ActionBarActivity類不能在API級別3或4上使用(運行時錯誤),因此MyActivity34不能在繼承路徑中的任何位置使用它。

我可能會說,最好的選擇是使用組合封裝任何重復的代碼。 創建一個包含所有共享代碼的類,然后從MyActivity和MyActivity34類進行調用。 通常,組合比陌生的繼承結構更好/更干凈。

用所有方法創建一個接口,例如MyCommonActivityInterface

public interface MyCommonActivityInterface {
    public void sayHello();
    public void sayGoodbye();
}

用所有代碼創建一個共同的活動

public class MyCommonActivity implements MyCommonActivityInterface {
    ...
    public void sayHello() {Log.d("MyCommonActivity", "says hello")};
    public void sayGoodbye() {Log.d("MyCommonActivity", "says goodbye")};
    ...
}

現在,您可以在兩個活動中重復使用通用代碼

public class MyActivity34 extends Activity {
    MyCommonActivityInterface common = new MyCommonActivity();
    public void sayHello() {common.sayHello()};
    public void sayGoodbye() {common.sayGoodbye()};
}

public class MyActivity extends ActionBarActivity {
    MyCommonActivityInterface common = new MyCommonActivity();
    public void sayHello() {common.sayHello()};
    public void sayGoodbye() {common.sayGoodbye()};
}

很好,實際上可以省略該接口,但是如果您需要在替代方案之類的地方進行交換,它將很方便。

依賴注入的強大功能給我留下了深刻的印象,它可以使這些事情變得更加清晰。

有一個叫做Dagger的庫,它增加了對Android的DI支持。 它的學習曲線有些陡峭,但對我而言,這都是值得的。

在此示例中,您將可以執行以下操作:

@Singleton
public class MyCommonActivity  {

    // Example with context to show that it will be automagically injected

    @Inject
    public MyCommonActivity(@ForActivity Context context) {}
    ...
    public void sayHello() {Log.d("MyCommonActivity", "says hello")};
    public void sayGoodbye() {Log.d("MyCommonActivity", "says goodbye")};
    ...
}

public class MyActivity34 extends Activity {

    @Inject MyCommonActivity common;

    public void sayHello() {common.sayHello()};
    public void sayGoodbye() {common.sayGoodbye()};
}

public class MyActivity extends ActionBarActivity {

    @Inject MyCommonActivity common;

    public void sayHello() {common.sayHello()};
    public void sayGoodbye() {common.sayGoodbye()};
}

使用很多獨立的代碼類,其中一些依賴於其他類,或者需要Context對象等。..只要在需要的位置和地點添加@Inject行,就可以節省很多代碼!

當我們添加它時,請看一下ButterKnife ,它簡單得多,但僅適用於注入Views。 仍然相當強大而整潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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