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

如何在没有实现的情况下删除类之间的重复代码?

如何在没有实现的情况下删除类之间的重复代码?

白衣非少年 2021-12-22 15:26:46
我编写了许多函数的实现来计算给定位置的斐波那契数。Fibonacci Class:这个类帮助我测试每个实现而无需重写相同的测试代码。我不想在fibonacci(n - 2).add(fibonacci(n - 1));这里添加“ ”,因为有些实现不使用它(命令式迭代、功能迭代)。public interface Fibonacci {  BigInteger fibonacci(int n);}递归斐波那契类public class SimpleRecursiveFibonacci implements Fibonacci{  public BigInteger fibonacci(int n) {    if(n < 2) {      return BigInteger.ONE;                 }    return fibonacci(n - 2).add(fibonacci(n - 1));  }}和 MemorizedRecursiveFibonacci 类public class MemoizedRecursiveFibonacci implements Fibonacci{  private Map<Integer, BigInteger> cache = new HashMap<>();  public BigInteger fibonacci(int n) {    if(n < 2) {      return BigInteger.ONE;    }    if(!cache.containsKey(n)){      BigInteger currentFibonacci = fibonacci(n - 2).add(fibonacci(n - 1));      cache.put(n, currentFibonacci);    }    return cache.get(n);  }}如我所见,MemorizedRecursiveFibonacci 类中有一些重复的代码 if(n < 2) {      return BigInteger.ONE;和  BigInteger currentFibonacci = fibonacci(n - 2).add(fibonacci(n - 1));我怎样才能保持干燥?删除重复的代码?
查看完整描述

2 回答

?
慕后森

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

该MemorizedRecursiveFibonacci可以委托给一个RecursiveFibonacci实例:


public class MemoizedRecursiveFibonacci implements Fibonacci {

  SimpleRecursiveFibonacci simple = new SimpleRecursiveFibonacci();

  private Map<Integer, BigInteger> cache = new HashMap<>();


  public BigInteger fibonacci(int n) {

    if(!cache.containsKey(n)) {

      BigInteger currentFibonacci = simple.fibonacci(n);

      cache.put(n, currentFibonacci);

    }


    return cache.get(n);

  }

}

或者,更优雅地,使用 Java 8 Map#computeIfAbsent:


public class MemoizedRecursiveFibonacci implements Fibonacci {

  SimpleRecursiveFibonacci simple = new SimpleRecursiveFibonacci();

  private Map<Integer, BigInteger> cache = new HashMap<>();


  public BigInteger fibonacci(int n) {

    return cache.computeIfAbsent(n, k -> simple.fibonacci(k));

}


查看完整回答
反对 回复 2021-12-22
?
白板的微信

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

那么抽象的公共父级呢?像这样的东西:


public abstract class ParentFibonacci implements Fibonacci {

    protected BigInteger getFirstValues(int n) {

        if (n < 2) {

            return BigInteger.ONE;

        }

        return BigInteger.ZERO;

    }

}

这样你的斐波那契实现需要实现 Fibonacci.fibonacci(int n) 并且可以使用父方法。


public class SimpleRecursiveFibonacci extends ParentFibonacci {


    public BigInteger fibonacci(int n) {

        if (n < 2) {

            return getFirstValues();

        }

        return fibonacci(n - 2).add(fibonacci(n - 1));

    }

}


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号