引子

今天涉及到一个将首页的课程详情页Fragment移动到之前是WebView VIP支付页,能让js调用Java方法能显示课程详情页

如何以最小的成本将课程页,移到VIP支付页。

不使用default

未使用default关键字,会如下图所示

未使用defalut关键字

WebActivity必须实现HomeContract.View接口中的所用接口,才可以使用CourseDetailFragment,然而CourseDetailFragment仅仅使用了HomeContract.View中的remove(Fragment fragment), hideTabs(), orderedCourse(CourseItem courseItem)

  1. hideTabs()隐藏首页的五个tab的回调,防止过度绘制,

  2. orderedCourse(CourseItem courseItem)预约课程成功后的回调到各个fragment,保证各页面的课程预约状态一致,

所以这两个方法在WebActivity也是不会用到的

使用default关键字

使用defalut关键词继承HomeContract.View接口,WebActivity只需实现remove(Fragment fragment),即可保证CourseDetailFragment不改一行代码,而WebActivity仅仅只需要实现remove(Fragment fragment)即可。

使用defalut关键字

总结

其实使用defalut关键字重新写一个接口并未实质上的减少方法数,CourseDetailFragment调用hideTabs()和orderedCourse(CourseItem courseItem)实际上还是调用了一个空方法实现,这样做减少实现类需要实现的方法数,和减少一个继承,这对Java的单继承来说还是比较有用的。

为什么说减少一个继承?

不使用default关键词,如果想要减少一个接口实现的方法数,只能写一个子类来是实现接口,子类中的方法是接口某些方法的空实现,so这就是一个接口变了一个类,接下来再来一个子类继承,复写上一个子类的没有实现的方法。单继承就被使用了,不能继承其他类了。而是使用default关键词后,如下TestImpl没有使用继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 使用default
public interface ITest {
void test1();
void test2();
void test3();
}
public interface Test2 extends ITest {
@Override
default void test1() {}
}
public class TestImpl implements Test2 {
@Override
public void test2() {}
@Override
public void test3() {}
}
// 未使用default
public interface ITest {
void test1();
void test2();
void test3();
}
public class Test2 implements ITest {
@Override
public void test1() {}
@Override
public void test2() {}
@Override
public void test3() {}
}
// 或则是抽象类
public abstract class Test2 implements ITest {
@Override
public void test1() {}
}
public class TestImpl extends Test2 {
@Override
public void test2() {}
@Override
public void test3() {}
}