繁体   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