为了账号安全,请及时绑定邮箱和手机立即绑定

避免类上的代码重复

避免类上的代码重复

呼啦一阵风 2021-07-13 17:01:21
我正在编写一些类,它们都实现了从接口继承的某个方法。除了对某个其他函数的一次调用之外,此方法对于所有类都几乎相同。例如:public void doSomething(){    int a = 6;    int b = 7;    int c = anOtherMethod(a,b);    while(c < 50){        c++;    }}如果多个类都有函数 doSomething() 但方法 anOtherMethod() 的实现不同怎么办?在这种情况下如何避免代码重复?(这不是我的实际代码,而是一个简化版本,可以帮助我更好地描述我的意思。)
查看完整描述

3 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

假设每个版本都anOtherFunction接受两个整数并返回一个整数,我只会让该方法接受一个函数作为参数,使其成为高阶。


接受两个相同类型参数并返回相同类型对象的函数称为 a BinaryOperator。您可以向方法中添加该类型的参数以传递函数:


// Give the method an operator argument 

public void doSomething(BinaryOperator<Integer> otherMethod) {

    int a = 6;

    int b = 7;


    // Then use it here basically like before

    // "apply" is needed to call the passed function

    int c = otherMethod.apply(a,b);

    while(c < 50) 

        c++;

    }

}

您如何使用它取决于您的用例。作为使用 lambda 的一个简单示例,您现在可以这样称呼它:


doSomething((a, b) -> a + b);

它只是返回的总和a及b。


但是,对于您的特定情况,您可能会发现将其doSomething作为接口的一部分并不是必需的或最佳的。如果相反,anOtherMethod需要提供什么?不要期望您的类提供 a doSomething,而是让它们提供 a BinaryOperator<Integer>。然后,当您需要从 获取结果时doSomething,从类中获取运算符,然后将其传递给doSomething。就像是:


public callDoSomething(HasOperator obj) {

    // There may be a better way than having a "HasOperator" interface

    // This is just an example though

    BinaryOperator<Integer> f = obj.getOperator();


    doSomething(f);

}



查看完整回答
反对 回复 2021-07-14
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

这看起来是模板方法模式的一个很好的例子。

  1. 放入doSomething一个基类。

  2. abstract protected anotherMethod也在该基类中声明,但不提供实现。

  3. 然后每个子类为 提供正确的实现anotherMethod


查看完整回答
反对 回复 2021-07-14
?
倚天杖

TA贡献1828条经验 获得超3个赞

这就是您如何实现 Thilo 在以下演示中谈到的技术:


主要类:


public class Main extends Method {


    public static void main(String[] args) {

        Method m = new Main();

        m.doSomething();

    }


    @Override

    public int anOtherMethod(int a, int b) {

        return a + b;

    }

}

抽象类:


public abstract class Method {


    public abstract int anOtherMethod(int a, int b);


    public void doSomething() {

        int a = 6;

        int b = 7;

        int c = anOtherMethod(a, b);


        System.out.println("Output: "+c);

    }

}

这样,您所要做的就是anOtherMethod()在要使用doSomething()方法的不同实现的每个类中进行覆盖anOtherMethod()。



查看完整回答
反对 回复 2021-07-14
  • 3 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信