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:我也只是大一新生,如果有哪里说的不对可以指出。)
(侵删)