Java避免类之间的循环依赖笔记–个人看法

  • Post author:
  • Post category:java



Java中吐过出现循环依赖的话一般都是


StackOverflowError

这个问题很棘手刚开始我遇到的时候也解决了半天,因为不知道为啥错,那么我先来解释一下什么叫循环依赖,直接上代码(代码网上随便拉的一个便于自己记忆)。


循环依赖其实就是类与类之间重复调用,看清楚这里是类和类之间不是方法,方法之间的调用是不会出现循环依赖的,那么个人解决的方法就是


设置一个接口。

public class Customer {
   private List<Bill> bills;
   //特定Customer的折扣根据订单数目计算
   public BigDecimal getDiscountAmount() {
       if (bills.size() > 5) {
           return new BigDecimal(0.1);
       } else {
           return new BigDecimal(0.03);
       }
   }
   public void createBill() {
       Bill bill = new Bill(this);
       if (bills == null) {
           bills = new ArrayList<Bill>();
       }
       bills.add(bill);
   }

}

public class Bill {
   private Customer customer;
   
   public Bill(Customer customer) {
        this.customer = customer;   
   }
   
   public BigDecimal pay() {
       BigDecimal discount =  new BigDecimal(1),subtract(
            this.customer.getDiscountAmount()).setScale(2,
            BigDecimal.ROUND_HALF_UP);
       //确认折扣和应付款代码省略
       return paidAmount;

  }

}

以上的代码应该很好理解这里不多做解释,应该看得出这里就是调用了Bill类。

private List<Bill> bills;




按照网上所说可以有多种方式打破循环依赖所用的方法是引入抽象,其实我理解起来就是不要直接调用类把类变成一个接口然后调用

引入DiscountCalculator

接口就可以做到

打破了Customer和Bill类之间依赖








接口代码



public interface DiscountCalculator {
    public BigDecimal getDisCountAmount();
}

public class Customer implements DiscountCalculator {
   private List<Bill> bills;
   //特定Customer的折扣根据订单数目计算
   public BigDecimal getDiscountAmount() {
       if (bills.size() > 5) {
           return new BigDecimal(0.1);
       } else {
           return new BigDecimal(0.03);
       }
   }
   
   public List<Bill> getBills() {
       return this.bills;
   }

   public void createBill() {
       Bill bill = new Bill(this);
       if (bills == null) {
           bills = new ArrayList<Bill>();
       }
       bills.add(bill);
   }

}




这里的话引入接口就可以打破循环依赖。





(ps:我也只是大一新生,如果有哪里说的不对可以指出。)





(侵删)




版权声明:本文为qq_35690742原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。