注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

“链式反应” (java)  

2012-05-09 11:46:47|  分类: 名词解释 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
如果在类的构造器中初始化了其他类,有可能会引起巨大的类初始化的“链式反应”,浪费系统资源,消耗系统时间,降低系统效率。所以,尽量在类要使用其他类的功能的时候,再初始化其他类,避免在方法调用时引发不必要的类初始化的“链式反应”。



参考:
《Java优化编程》第六章——类与接口

6.1 类的构造器

    当类初始化时必然首先会调用构造器。因此可以在类的构造器中加入在要求其对象实例做其他工作之前所作的必要的准备工作。

    6.1.1 构造器编写规则

1、 避免在类的构造器中初始化其他类

    如果在的构造器中初始化了其他类,有可能会引起巨大的类初始化的“链式反应”,浪费系统资源,消耗系统时间,降低系统效率。所以,尽量在类要使用其他类的功能的时候,再初始化其他类,避免在方法调用时引发不必要的类初始化的“链式反应”。

2、 不要给构造器无添加返回值

3、 尽量避免在构造器中对静态变量做赋值操作

    对静态变量赋静态值只需一次即可。如:

public class A {

    static String str = null;

    public A () {

        //对静态变量做赋值操作

        str = "this is string";

        ...

    }

    ...

}

    正确的做法是:

public class A {

    static String str = null;

    public A () {

        //使用判断句避免重复赋值

        if (str == null){

            str = "this is string";

        }

        ...

    }

    ...

}

    或者在对变量声明时赋值。如:

public class A {

    static String str = "this is string";

    public A () {

    //做必要的初始化工作

        ...

    }

    ...

}

4、 不要在类的构造器中创建类的实例

public class A {
    A myInstance = null;

    public A() {

        myInstance = new A();

    }

}

    如果此时在其他类中创建类A的实例,就将引发构造器递归调用,造成系统死循环。

 

6.2 类的继承规则

    6.2.1 单线继承规则

    类的继承概念在Java语言中与C++语言有所不同。在C++语言中类是可以多重继承的,即一个类可以有一个以上的父类。但是在Java语言中,一个类只能有一个父类,不可以同时继承两个父类。但接口是可以多重继承的,也就是说,在Java语言中一个接口可以同时有多个父接口。

    6.2.2 包内部继承规则

    在通常情况下创建一个类的时候,习惯上将它声明为public类型,这样可以使这个软件包名称空间以外的类可以访问该类。只有下面两种情况,不在类的生命中添加public关键字:

(1) 当一个类是另一个类的内部类(Inner Class)的时候;

(2) 当一个类不想被其所在包名称空间以外的成员类访问的时候。

    6.2.3 逻辑包含继承规则

    下面的继承规则是合理的:

(1) 现实世界的事务继承关系,可以作为软件系统中类继承关系的依据。

(2) 包含关系的类之间不存在继承关系。

(3) 如果在逻辑上类B是类A的一种,并且类的所有属性和行为对类而言都有意义,则允许B继承A的行为和属性(私有属性与行为除外)。

    注意:累的继承层次不宜过深,尽量避免较深的类继承层次的出现,过深的类的继承层次会引发很多应用与维护问题。

 

6.3 抽象类与接口

    抽象类与接口的相同点:

1、 接口不能呗实例化,抽象类也不能被实例化。

2、 接口中可以有属性,抽象类中也可以有属性。

    抽象类与接口的不同点:

1、 接口中的所有属性与方法的声明都必须是public类型,除abstract方法外,抽象类的属性与方法既可以是public类型,又可以是private类型或protected类型,abstract方法只能是public类型或者protected类型。

2、 接口中的所有属性都必须是常量,而抽象类则没有这个限制。

3、 接口中的方法不能有方法体,而抽象类中的方法是可以有方法体的,甚至可以使抽象方法。

4、 接口只能被类实现(implements),而抽象类只能被类继承(extends)。

5、 接口可以是多重继承,而抽象类只能单线继承。

6、 接口不可以作为主应用程序独立运行,而抽象类在特定的声明下却可以作为主应用程序独立运行。

 

6.4 继承与组合的应用时机

继承与组合使用的基本规则:

(1) 如果现存的类的功能通过组合就可以完成新的功能需求,应该使用组合而不是继承。

(2) 如果仅仅是为了代码重用,最好不要使用继承,应该使用组合。

规则产生的原因是:

(1) 在Java语言中类的继承是单线的,要一个类同时兼有多个类的功能,需要通过多次继承才能够实现,影响继承规则,书写繁琐,程序复杂。

(2) 继承有时会使类库爆发式增长,使系统过于庞大而无法控制。

 

6.5 接口与抽象类的应用时机

6.6 内部类

6.7 与性能相关的建议与经验

1、 避免复杂、昂贵的构造过程,例如一维数组比多维数组要快一些。

2、 内部类对象的创建相对一般类的实例化要复杂、耗时一些。最好用非public的具体类替换之。

3、 在程序设计中尽量使用接口,因为接口的结构更容易被交换,以提高系统的性能。

4、 使用原数据类型的包装类比使用原数据要低效。

5、 最好把所有只进行一次初始化的变量,放在类构造器中一次性初始化。

6、 大多数的JVM在搜索接口列表时都是从后向前搜索的,因此,经常用到的接口最好位于implements关键字列表的最后面。

7、 最好通过Class.forname()动态的装载类。

  评论这张
 
阅读(1230)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016