`
qqbwww
  • 浏览: 60173 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

effective JAVA(一) 创建和销毁对象

 
阅读更多

摘自Effective Java中文版

2

 创建和销毁对象

1条:考虑用静态工厂方法代替构造函数:

         静态工厂方法的好处:

1.具有名字。如果构造函数没有确切地描述被返回的对象,那么选用适当名字的静态工厂可以是一个类易于使用,并且相应的客户代码更易于阅读。

         2.静态构造方法每次被调用的时候,不要求非得创建一个新的对象。

         3.可以返回一个原返回类型的子类型的对象。

                   服务提供者框架:提供者为框架的用户提供了多个API实现,框架必须提供一种机制来注册(register)这些实现,以便用户能够使用它们。框架的客户直接使用API,无需关心自己到底在使用哪个实现。

         静态工厂方法的缺点:

         1.类如果不含公有的或者受保护的构造函数,就不能被子类化。

         2.他们与其他的静态方法没有任何区别。

         静态方法的名字:

            valueOf—返回的实例与它的参数具有同样的值。使用这个名字的静态工程方法是一些非常有效的类型转换操作符。

            getInstance—返回的实例算是由方法的参数来描述,但是不能够说与参数具有哦他那个样的值。

2条:使用私有构造函数强化singleton属性

         方法:

            1.   提供公有的静态final域。

公有的静态域是final的,所以该域将总是包含相同的对象引用。

public class FinalField {

    public  static final FinalField ff = new FinalField();

   

    private FinalField(){

      

    }

   

}

 

            2.  提供公有的静态工厂方法。

提供了灵活性

public class FinalMethod {

    private static final FinalMethod fm = new FinalMethod();

    private FinalMethod(){

      

    }

    public static FinalMethod getInstance(){

       return fm;

    }

}

 

为了使singleton类编程可序列化的(serializable),仅仅在声明中加入”implements Serializable”是不够的,为了维护singleton性,你必须也要提供一个readResolve方法。反序列化之后新创建的对象会先调用此方法,该方法返回的对象引用被返回,取代了新创建的对象。本质上,该方法忽略了新建对象,仍然返回类初始化事创建的那个实例。否则的话,一个序列化的实例在每次反序列化的时候,都会导致创建一个新的实例。

private Object readResolve() throws ObjectStreamException{

       /**

        * 返回那个真正的FinalMethod实例,让垃圾回收器

        * 回收其他反序列化生成的实例

        */

       return fm;

    }

3条:通过私有构造器强化不可实例化的能力。

                   通过将一个类做成抽象类来强制该类不可被实例化是行不通的。由于只有当一个类不包含显示的构造函数的时候,编译器才会生成默认构造函数,所以,我们只要让这个类包含单个显式的私有构造函数,则它就不可被实例化。

4条:避免创建重复的对象

如果一个对象是非可变的,那么它总是可以被重用。

对于同时提供了静态工厂方法和构造函数的非可变类,你通常可以利用静态工厂方法而不是构造函数,以避免创建重复的对象。

适配器:它把功能委托给后面的一个对象,从而为后面的对象提供体格可选的接口。

5条:消除过期的对象引用。

如果一个栈显示增长,然后在收缩,那么从栈中弹出来的对象不会被当作垃圾回收,即使使用栈的客户程序不再引用这些对象,他们也不会被回收。这是因为,栈内部维护者对这些对象的过期引用。
      
过期引用:是指永远也不会被解除的引用。

一般而言,只要一个类自己管理它的内存,程序员就应该警惕内存泄漏问题,一旦一个元素被释放掉,则该元素中包含的任何对象引用应该被清空。

内存泄漏的另一个常见来源是缓存。

6 避免使用终结函数。

终结函数并不能保证会被及时地执行,从一个对象变得不可到达开始,到它的终结函数被执行,这段事件的长度是任意的、不确定的。这意味着,事件关键的任务不应该由终结函数来完成。我们不应该依赖一个终结函数来更新关键性的永久状态。

正确的中止方式是提供一个显式的终止方法。显式的终止方法通常与try-finally结构结合起来使用,以确保及时中止。

终止函数的作用:

1.忘记调用显式终止函数,终结函数可以作为安全网,关闭相关资源(但不能保证及时)。

2.与对象的本地对等体有关。(因为本地对等体不是一个普通对象,所以垃圾回收期不会知道它),当普通对象被回收后,且本地对等体并不拥有关键资源,那么可以用终结函数调用显式的终止方法(本地方法或调用本地方法)。

本地对等体对象:本地对等体是一个本地对象,普通对象通过本地方法委托给一个本地对象。

终结函数链:(并不会被自动执行)如果一个类有一个终结函数,并且一个子类改写了终结函数,那么子类的和总结函数必须要手工调用超类的终结函数。

分享到:
评论

相关推荐

    Effective Java第三版1

    ### 第二章 创建和销毁对象 这一章深入探讨了对象的生命周期管理,包括: 1. **静态工厂方法**:相比构造器,静态工厂方法有优点如可以不返回新实例、允许返回同一实例(单例)、可以有更具选择性的访问控制,并且...

    《Effective Java》读书分享.pptx

    在 Java 中,创建和销毁对象是非常重要的。静态工厂方法可以代替构造器,提供了更多的灵活性和性能优势。静态工厂方法可以返回原类型的任何子类型,且可以将构建好的实例缓存起来,方便重复利用,不用每次调用都创建...

    Effective Java.zip

    1. **第2章 创建和销毁对象** - 单例模式:讲解了如何正确实现单例类,避免多线程环境下的并发问题。 - 构造函数:强调构造函数应简洁,避免在构造过程中执行复杂操作。 - 工厂方法:介绍工厂方法模式,作为创建...

    Effective Java 第三版

    书中的一些关键知识点可能包括:理解对象的创建和销毁、接口设计、类设计、方法设计、泛型的使用、异常处理、并发编程、Java集合框架的使用和扩展等等。在学习这些内容时,读者将被引导深入理解Java语言的细节,并...

    Effective.Java_Java8_并发_java_effectivejava_

    目录:一、创建和销毁对象 (1 ~ 7)二、对于所有对象都通用的方法 (8 ~ 12)三、类和接口 (13 ~ 22)四、泛型 (23 ~ 29)五、枚举和注解 (30 ~ 37)六、方法 (38 ~ 44)七、通用程序设计 (45 ~ 56)八、异常 ...

    java逻辑思维笔试题-effective-java-3rd-edition:有效的Java第3版注释

    创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 12 - 序列化 第 2 章 - 创建和销毁对象 第 1 项 - 考虑静态工厂...

    Effective-Java读书笔记(上)

    #### 第二章 创建/销毁对象 ##### 用静态工厂方法代替构造器 在面向对象编程中,对象的创建通常是通过构造器来完成的。然而,在某些情况下,使用静态工厂方法来创建对象可能会更加灵活和高效。 **静态工厂方法的...

    java7hashmap源码-Effective-Java-3th:Effective-Java-3th

    创建和销毁对象 考虑使用静态工厂方法代替构造方法 优点: 有名字 每次调用的时候,不一定要创建新的对象 可以返回一个类型的子类型 Collections就是这种用法 返回对象的类可以随调用的不同而变化(用输入的参数值...

    effecive java 中文版 第二版

    通过以上对“Effective Java 中文版 第二版”的核心知识点的总结,我们可以看到这本书覆盖了Java编程语言的各个方面,包括面向对象设计原则、类与接口的设计、对象的创建与销毁、枚举类型与注解、泛型与集合框架以及...

    effective-swift:阅读Effective Java 3E,了解编程中的习惯用法和有效用法,并提出在Swift中使用它的方法。

    第2章对象的创建和销毁 项目编号 标题 副标题 经理 项目1 项目2 项目3 项目4 项目5 不要直接指定资源,请使用依赖对象注入 莉娜 项目6 避免不必要的对象创建 德玛 项目7 释放使用的对象参考 莉娜 项目8 避免使用...

    最新的java程序员不可不学的java基础教程

    2. **类与对象**:Java是一种面向对象的语言,理解类的定义、对象的创建与销毁、封装、继承、多态等概念至关重要。同时,深入探讨构造函数、访问修饰符、抽象类与接口的应用。 3. **异常处理**:Java中的try-catch-...

    java源码期编译器运行时-Effective-JAVA-Summary:JoshuaBloch的EffectiveJava2ndEditio

    创建和销毁对象 1.使用静态工厂方法而不是构造函数 好处 与构造函数不同,它们有名称 与构造函数不同,它们不需要在每次调用时都创建一个新对象 与构造函数不同,它们可以返回其返回类型的任何子类型的对象 它们减少...

    Java实现多种单例模式

    这种模式在需要频繁创建和销毁对象的场景中尤其有用,因为它可以节省系统资源并确保对象间的协调一致。以下是Java实现的六种单例模式的详细解释: 1. 懒汉式(Lazy Initialization): 这种方式延迟了单例对象的...

    Java并发实践英文版(Java Concurrency in Practice)

    - **线程池**:通过管理一组预先创建好的线程来提高性能,避免频繁创建和销毁线程的开销。 - **不可变对象**:使用不可变对象可以避免并发修改问题,因为一旦创建后其状态就不能改变。 #### 七、本书内容概览 第一...

    java必备知识点大全.pdf

    final、finally、finalize三者区别:final用于声明常量,finally用在try-catch-finally语句中表示必须执行的代码块,finalize是Object类的一个方法,垃圾回收器在销毁对象之前会调用它。 Io流的层次结构:Java中Io...

    【IT十八掌徐培成】Java基础第19天_05_单例模式.zip

    优点:节约系统资源,对于频繁使用的对象,可以省去创建和销毁对象所花费的时间;控制实例数目,对某些需要频繁创建和销毁的对象,使用单例模式可以提高系统性能;当想实例化一个类时,类已经实例化过了,就可以直接...

    java单例模式代码实例

    1. 节省内存:对于只需要一个实例的对象,可以避免频繁创建和销毁对象带来的内存消耗。 2. 提高效率:全局唯一的实例,减少对象间的交互复杂性。 3. 控制实例化过程:可以控制实例化过程,如初始化资源、设置默认值...

Global site tag (gtag.js) - Google Analytics