在 Java 8 中,接口中允许有缺省实现的抽象方法
看例程:不用抽象类,而是使用缺省方法的接口
// >> TODO 缺省的实现方法,用default修饰,可以有方法体
public interface ExpireDateMerchandise {
// >> TODO 缺省的实现方法,用default修饰,可以有方法体
/**
* 截止到当前,商品的保质期天数是否超过传递的天数
*
* @param days 截止到当前,保质期超过这么多天
* @return 截止到当前,true如果保质期剩余天数比参数长,false如果保质期不到这多天
*/
default boolean notExpireInDays(int days) {
return daysBeforeExpire() > days;
}
/**
* @return 商品生产日期
*/
Date getProducedDate();
/**
* @return 商品保质期到期日
*/
public abstract Date getExpireDate();
/**
* @return 截止到当前,剩余保质期还剩下总保质期长度的百分比
*/
default double leftDatePercentage() {
return 1.0 * daysBeforeExpire() / (daysBeforeExpire() + daysAfterProduce());
}
/**
* 根据剩余的有效期百分比,得出商品现在实际的价值
*
* @param leftDatePercentage 剩余有效期百分比
* @return 剩余的实际价值
*/
double actualValueNow(double leftDatePercentage);
// >> TODO 接口中可以有私有方法,不需要用default修饰
// >> TODO 接口里的私有方法,可以认为是代码直接插入到使用的地方
private long daysBeforeExpire() {
long expireMS = getExpireDate().getTime();
long left = expireMS - System.currentTimeMillis();
if (left < 0) {
return -1;
}
// 返回值是long,是根据left的类型决定的
return left / (24 * 3600 * 1000);
}
private long daysAfterProduce() {
long produceMS = getProducedDate().getTime();
long left = System.currentTimeMillis() - produceMS;
if (left < 0) {
return -1;
}
// 返回值是long,是根据left的类型决定的
return left / (24 * 3600 * 1000);
}
}
import java.util.Date;
// >> TODO 实现有缺省方法的接口后,面对每个缺省的方法,一个类可以有三个选择
// TODO 1)默默继承,相当于把这部分代码,拷贝到了当前类当中
// TODO 2)重新声明此方法为abstract,相当于把这部分代码拒之门外,但是有abstract方法,也就是类必须是抽象的
// TODO 3)覆盖,重新实现
public class GamePointCard extends MerchandiseV2 implements ExpireDateMerchandise, VirtualMerchandise {
private Date produceDate;
private Date expirationDate;
public GamePointCard(String name, String id, int count, double soldPrice, double purchasePrice, Date produceDate, Date expirationDate) {
super(name, id, count, soldPrice, purchasePrice);
this.produceDate = produceDate;
this.expirationDate = expirationDate;
}
@Override
public Date getProducedDate() {
return produceDate;
}
@Override
public Date getExpireDate() {
return expirationDate;
}
@Override
public double actualValueNow(double leftDatePercentage) {
return super.getSoldPrice();
}
}
缺省的实现方法,用default修饰,可以有方法体
接口中可以有私有方法,不需要用default修饰
接口里的私有方法,可以认为是代码直接插入到使用的地方
实现有缺省方法的接口后,面对每个缺省的方法,一个类可以有三个选择
1)默默继承,相当于把这部分代码,拷贝到了当前类当中
2)重新声明此方法为abstract,相当于把这部分代码拒之门外,但是有abstract方法,也就是类必须是抽象的
3)覆盖,重新实现