昨天参与的公司另一部门的新项目,在看系统架构的时候产生了一个对继承的问题。求解。该架构中,常用的CommonDaoImp类注入到业务business类,而模块化的xxxDaoImp类不继承该CommonDao,同样注入到business类。  而以往的习惯都是xxxDao extends CommonDao 从而引发了一段和部门技术人员的对话。该系统的架构人员称CommonDao属于纯方法体,如果使用继承,在子类加载的时候会把父类的所有属性及方法加载到子类中而造成子类的臃肿。差不多是这种表达。而我的回应是,我认为做继承仅仅只是一种引用。(说的不是很专业化,见谅)加载的时候仅加载一次父类的方法,当子类中调用父类的成员及函数的时候,直接调用父类的方法。不是到这么描述各位是否清楚。  总的而言我认为,在系统中继承的情况下,父类仅仅加载一次,而对方的观点是,子类加载的时候,会将父类的成员及函数同时加载到子类中而造成系统中某方面的臃肿。有没研究过这方面JVM的牛人,给点指点。上100分。

解决方案 »

  1.   

    没研究过JVM 
    不过我觉得extends CommonDao 做法没什么不好的 抽取公用方法 这样也可以提高开发效率
    不过CommonDao 这个类的方法 还是大家评审下 也不能什么都往里写
      

  2.   

    建议LZ可以研究一下《深入java虚拟机》这本书。子类的实利化对父类的影响不是一个非常简单的过程。
    LZ可以看看这本书。
      

  3.   

    也可以这样啊,系统的架构人员说的也不无道理,可能注入的xxxDaoImp和commonDao关系不是很大,是独立的,他基本用不到commonDao中的方法,所以不继承呗。
      

  4.   

    jvm在初始化的时候有一个原则:在首次主动使用时初始化。有六种情况。其中一种是子类的初始化会引发父类初始化。
    所以子类的实例化必然会引发父类的初始化。会造成所谓的“臃肿”。而接口则很大程度不会造成这个现象。
      

  5.   


    我能接收这种设计  只是这次对话中引发了我对继承的想法  在思索同一个父类在系统中过多的继承是否会对系统增加不必要的压力。  现在系统中大都交给了spring做单例控制,父类及子类都在系统启动的时候单例模式初始化了。 让我纠结的是,子类在初始化的时候,或者这么说吧。譬如10个子类继承同一个父类  11个类都在spring的factory管理中。在系统启动的时候,11个子类都将初始化
    (我个人比较喜欢静态化的单例模式,避免多线程的情况下出的问题,以及锁、多重锁的资源消耗。)
    那么是否11个子类在初始化的同时会将父类的所有内容加载到子类的实例中去,还是说仅仅也只是一个引用。在调用父类方法的时候直接的引用到父类的实例中去调用。建议LZ可以研究一下《深入java虚拟机》这本书。子类的实利化对父类的影响不是一个非常简单的过程。
    LZ可以看看这本书。谢谢4楼推荐,一定会看。8楼兄弟,谢谢回答。一会去找找这6种情况的区别。之前没有研究过jvm层。看来本人有必要往深点钻一钻了。
      

  6.   

    简化一下   这么问吧1个父类中  拥有属性
    private String str1 = "123";
    get...();
    set...();
    public String str2 = "abc";
    get...();
    set...();
    单例
    private static F类 f = new F类();
    public static F类 getInstact() {
        return f;
    }
    10个子类继承这个
    private static C类1 c1 = new C类1();
    .
    .
    .
    private static C类1 c10 = new C类10();
    public static C类10 getInstact() {
        return c10;
    }
    问题:在系统启动后,内存中有几个 "123"和几个"abc"
      

  7.   

    同意八楼的说法
           如果是普通的继承,子类加载的时候父类肯定会初始化,而且是每次子类初始化父类都会初始化的,你们公司那个架构师说的并不无道理,肯定会造成臃肿;
           如果是spring把父类注入到子类中,spring有对象池,每次都从对象池里去取,因此父类只会加载一次
      

  8.   

    呵呵,8楼和4楼都是我啦。lz贴的代码太乱啦。你可以写一小段代码自己测试一下下。java给人的印象往往是那些光鲜的时髦的词汇。往往我们以为记住或者理解了这些东西就是掌握java甚至是掌握了计算机技术。计算机人,还是冷静一下下。真正的实力来自于基础。所以任何时候底层的东西、数据结构、常用的算法之类的东西都不会过时,而是会永远时髦下去的东西。跟大家共勉。