时隔半年,再次读《effective java》,看到书上关于静态工厂方法与构造器比较那里的一句话感触良多:“API可以返回对象,同时又不会使对象的类变成共有的”。
再次对这句话谈谈自己的理解
1.Java方法的权限和继承
很简单的一句话,重写方法时,子类的权限只能比父类更宽松。比如父类的方法权限是protected修饰的,子类重写这个方法时,只能是public或者protected,如果改成private编译期间就会报错。
2.Java类的权限和继承
类的权限修饰符和继承没有关系,父类是private、public等等,子类都可以是private或者public。
3.多态VS权限
考虑这样一种需求,我们想让客户运行我们的某个方法,但是又不想暴露这个方法所属的类,换句话说:这个类是private、default或者proected权限的,我们怎么才能让客户随心所欲调用我们这个类的方法,还不会暴露类细节呢?
答案是:多态
(1)首先给用户提供访问的接口
public interface A{
void fun();
}
1
2
3
(2)提供得到A对象的工厂类
public class AFactory{
private static A a = new B();
public static A getInstance(){
return a;
}
public void registryA(String className){
if("B".equals(className)){
a = new B();
} else if("C".equals(className)){
a = new C();
}
}
private class B implements A{
@Override
public void fun(){
System.out.println("this is B class");
}
}
private class C implements A{
@Override
public void fun(){
System.out.println("this is C class");
}
}
}
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
(3)用户可以访问private的B类的fun方法了!
public class Main{
public static void main(String[] args){
//访问默认的B类
A a = AFactory.getInstance();
a.fun();
//访问C类
AFactory.registryA("C");
A a2 = AFactory.getInstance();
a2.fun();
}
}
1
2
3
4
5
6
7
8
9
10
11
(4)观察输入,我们发现B类和C类的fun被调用了!利用多态机制,我们成功的使private的类B的fun方法被访问到了。
4.我们到底干了什么?
其实,服务提供者框架就是来自上面的思想。
再比如JDBC中,服务提供者接口就是Connection,DriverManager. registerDriver或者Class.forName就是提供者注册API,Drivermanager.getConnection就是服务访问API。
这样设计的好处有很多,比如天生符合面向接口编程,我们给客户暴露接口A,让他们只能用A去调用子类的方法,而子类被我们封装好了,用户不会看到。如果以后要扩展或者修改B类,可以直接进行更改,用户不会感知,这对我们研发非常方便!
---------------------
作者:K_zer0
来源:CSDN
原文:https://blog.csdn.net/K_zer0/article/details/80992906
版权声明:本文为博主原创文章,转载请附上博文链接!