WebWork深度探索之号外

时间:2020-12-08 13:33:42

        昨天开始对WebWork进行了一些初步的探索[1],虽然进展缓慢,但是在阅读与分析其源代码的时候,还是有颇多的收获。这些所得并不属于探索WebWork本身,因而将此篇列为号外。
        在ActionFactory类中,有如下代码:

WebWork深度探索之号外WebWork深度探索之号外public abstract class ActionProxyFactory  {
WebWork深度探索之号外  
static ActionProxyFactory factory = new
 DefaultActionProxyFactory();
WebWork深度探索之号外WebWork深度探索之号外  
public static void setFactory(ActionProxyFactory factory) 
{
WebWork深度探索之号外     ActionProxyFactory.factory 
=
 factory;
WebWork深度探索之号外   }

WebWork深度探索之号外WebWork深度探索之号外  
public static ActionProxyFactory getFactory() {
WebWork深度探索之号外    
return
 factory;
WebWork深度探索之号外   }

WebWork深度探索之号外}
WebWork深度探索之号外
WebWork深度探索之号外

        对于类ActionProxyFactory而言,setFactory方法用于设置静态类变量factory的初始值,如果该方法没有被调用的话,那么通过getFactory方法就会获得ActionProxyFactory默认派生子类的实例。这样的设计最大的好处就是灵活,即使在整个流程当中改变了ActionProxyFactory的实现,对外的接口也是一直保持不变。
        接着,就是DefaultActionProxyFactory的代码了:

WebWork深度探索之号外WebWork深度探索之号外public class DefaultActionProxyFactory extends ActionProxyFactory  {
WebWork深度探索之号外WebWork深度探索之号外    
public DefaultActionProxyFactory() 
{
WebWork深度探索之号外            super();
WebWork深度探索之号外       }

WebWork深度探索之号外}

WebWork深度探索之号外

        DefaultActionProxyFactory的实现平淡无奇,只是构造函数的实现激起了我的兴趣,首先,ActionProxyFactory作为其父类,本身是一个Abstract的类,既然是这样,ActionProxyFactory是不允许被实例化的,那么她哪里来构造函数呢?其次,子类被实例化的时候,就是构造函数被调用的时候,默认是先调用父类默认的构造函数的(默认构造函数就是不带参数的构造函数),那么代码中的super()是不是有点多余了呢?由第二个问题引申开去,就产生了另外一个很基本的问题,如果父类中定义了包含参数的构造函数,而且是多个的时候,子类在默认情况下会调用哪一个呢?
        第一、Abstract类是拥有构造函数的,可以通过在AbstractProxyFactory中定义带参数的构造函数来证明这一点。虽然Abstract类的构造函数不能够直接通过new操作去调用,但是它可以被子类的构造函数调用。因为继承是让子类拥有跟父类一样的行为和属性,而继承很大的一部分工作都是依靠调用父类的构造函数来完成,如果父类没有构造方法,又如何实现继承呢?
        第二、我个人认为super()是多余的,因为默认的构造函数本来就会做这样的工作;
        第三、在默认情况下,哪个都不会被调用。也就是说如果父类定义了包含参数的构造函数,那么子类必须在其构造方法中显式调用父类的构造方法,否则无法编译通过。
    
         [1] WebWork深度探索之盲人摸象