避免Java代码重复的良好做法

问题描述 投票:0回答:3

我有一个规范接口,可以将其称为Spec,而实现它的两个类则可以将它们称为ImpAImpB。效果很好,直到我意识到ImpAimpB的很少方法共享相同的实现。我试图通过在默认情况下在Spec中声明方法并在其中正确实现这些方法来避免这种情况,但是我敢肯定,有更好的方法可以做到这一点。也许有一些设计模式?

java design-patterns architecture software-design
3个回答
3
投票

如果重复的代码不使用类的状态(实例变量),则将代码放在接口的默认方法中是一种解决方案。

对于需要访问类实例变量的更复杂的情况,可以使用通用代码创建另一个抽象类。然后ImpAImpB将扩展抽象类。

Java中的集合同时使用了两者。例如,ArrayListLinkedList扩展了AbstractList,它实现了List,其中包含一些默认方法。


2
投票

虽然您可以像建议的那样使它们成为default方法,但另一个可能的解决方案是使用Delegation设计模式。这意味着具有第四类,其完全是为了分离公共逻辑。如果该逻辑需要操作的值,则应将它们注入到委托中以允许其独立运行(并进行测试)。

个人而言,我发现更喜欢委托而不是组成的代码更优雅,更可测试并且更“可重构”。但是,就像许多其他设计问题一样,对此有很多不同而有效的意见。

interface Spec { 
    void method();
}

class Imp1 implements Spec {
    private final Delegate delegate;

    public Imp1() {
        this.delegate = new Delegate(...);
    }

    public void method() {
        delegate.setContext(...);
        delegate.method();
    }
}

-1
投票

您可以使Spec成为超类,并使ImpA和ImpB成为子类。您可以找到更多信息on the JavaDoc

© www.soinside.com 2019 - 2024. All rights reserved.