避免在Java库中{2}个类似的子类中重复的方法定义

时间:2016-07-28 00:01:05

标签: java dry

我遇到了一个问题而且我不知道描述它的技术术语,所以我自己很难找到答案,我希望有人可能会这样做能够揭示这里发生的事情。

假设一个库有两个或更多类似功能有点类似的类,比如JTextField和JTextArea。我想为这两个类提供一个额外的方法。

我可以扩展这两个类并将方法添加到每个类中,但是要添加的方法可能非常相似,可以将其复制并粘贴到每个类中。这让我觉得有更好的方法可以做到这一点。

在这个简化的例子中,是否可以: A)消除" getStringValue()"的近似重复定义。 CustomJTextField和CustomJTextArea之间 而 B)保留JTextArea和JTextField的原始功能。

概念示例:

public interface AnInterface {
    public String getStringValue();
}

public class CustomJTextField implements AnInterface{
    //Could Duplication of this method be avoided?
    @Override
    public String getStringValue(){
        return this.getText();
    }
}

public class CustomJTextArea implements AnInterface{
    //Mirrors CustomJTextField's definition
    @Override
    public String getStringValue(){
        return this.getText();
    }
}

public class CustomJCheckbox implements AnInterface{
    @Override
    public String getStringValue(){
        return this.isSelected() ? "Checked" : "Not Checked";
    }
}

public class Main{
    public static void main(String[] args) {
        ArrayList<AnInterface> items = new ArrayList<AnInterface>();
        items.add(new CustomJTextField());
        items.add(new CustomJTextArea());
        items.add(new CustomJCheckbox());

        for (AnInterface item : items){
            String output = item.getStringValue();
            System.out.println(output);
        }
    }
}

我很沮丧的是,我似乎只是在不丢失JTextField和JTextArea的功能的情况下扩展JTextComponent,但如果两者都被扩展,那就感觉就像是不必要的重复。有没有一种优雅的方法来避免这种重复?

1 个答案:

答案 0 :(得分:1)

如果您使用Java 8,那么default定义中的interface方法实施就会提供一个很好的解决方案。

在上面的示例中,您可以将AnInterface定义为

public interface AnInterface {
    public getText(); // Abstract method (re)definition

    default String getStringValue() {
        return this.getText();
    }
}

并且仅覆盖getStringValue()类的CustomJCheckbox方法。

当然,对于具有普通(例如,1行)实现的方法,上述内容几乎没有价值。但是,它对于复杂的复杂方法非常有用。