避免类上的代码重复

我正在编写一些类,它们都实现了从接口继承的某个方法。除了对某个其他函数的一次调用之外,此方法对于所有类都几乎相同。


例如:


public void doSomething(){

    int a = 6;

    int b = 7;

    int c = anOtherMethod(a,b);

    while(c < 50){

        c++;

    }

}

如果多个类都有函数 doSomething() 但方法 anOtherMethod() 的实现不同怎么办?


在这种情况下如何避免代码重复?(这不是我的实际代码,而是一个简化版本,可以帮助我更好地描述我的意思。)


呼啦一阵风
浏览 167回答 3
3回答

HUH函数

假设每个版本都anOtherFunction接受两个整数并返回一个整数,我只会让该方法接受一个函数作为参数,使其成为高阶。接受两个相同类型参数并返回相同类型对象的函数称为 a BinaryOperator。您可以向方法中添加该类型的参数以传递函数:// Give the method an operator argument&nbsp;public void doSomething(BinaryOperator<Integer> otherMethod) {&nbsp; &nbsp; int a = 6;&nbsp; &nbsp; int b = 7;&nbsp; &nbsp; // Then use it here basically like before&nbsp; &nbsp; // "apply" is needed to call the passed function&nbsp; &nbsp; int c = otherMethod.apply(a,b);&nbsp; &nbsp; while(c < 50)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; c++;&nbsp; &nbsp; }}您如何使用它取决于您的用例。作为使用 lambda 的一个简单示例,您现在可以这样称呼它:doSomething((a, b) -> a + b);它只是返回的总和a及b。但是,对于您的特定情况,您可能会发现将其doSomething作为接口的一部分并不是必需的或最佳的。如果相反,anOtherMethod需要提供什么?不要期望您的类提供 a doSomething,而是让它们提供 a BinaryOperator<Integer>。然后,当您需要从 获取结果时doSomething,从类中获取运算符,然后将其传递给doSomething。就像是:public callDoSomething(HasOperator obj) {&nbsp; &nbsp; // There may be a better way than having a "HasOperator" interface&nbsp; &nbsp; // This is just an example though&nbsp; &nbsp; BinaryOperator<Integer> f = obj.getOperator();&nbsp; &nbsp; doSomething(f);}

梵蒂冈之花

这看起来是模板方法模式的一个很好的例子。放入doSomething一个基类。abstract protected anotherMethod也在该基类中声明,但不提供实现。然后每个子类为 提供正确的实现anotherMethod。

倚天杖

这就是您如何实现 Thilo 在以下演示中谈到的技术:主要类:public class Main extends Method {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; Method m = new Main();&nbsp; &nbsp; &nbsp; &nbsp; m.doSomething();&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public int anOtherMethod(int a, int b) {&nbsp; &nbsp; &nbsp; &nbsp; return a + b;&nbsp; &nbsp; }}抽象类:public abstract class Method {&nbsp; &nbsp; public abstract int anOtherMethod(int a, int b);&nbsp; &nbsp; public void doSomething() {&nbsp; &nbsp; &nbsp; &nbsp; int a = 6;&nbsp; &nbsp; &nbsp; &nbsp; int b = 7;&nbsp; &nbsp; &nbsp; &nbsp; int c = anOtherMethod(a, b);&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Output: "+c);&nbsp; &nbsp; }}这样,您所要做的就是anOtherMethod()在要使用doSomething()方法的不同实现的每个类中进行覆盖anOtherMethod()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java