Effective Java学习

									**第二章--创建和销毁对象**
        本章的主题是创建和销毁对象:何时以及如何创建对象,何时以及如何避免创建对象,如何确保他们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作。
        (why为什么要创建对象--因为你需要使用内存的资源,只有拥有对象才能在内存中分配地址。代码构成的程序被编译成指令在内存中执行,内存可以理解成一栋房子,假如某一层房子里有你需要的书,你想知道书的信息(这是个奇特的世界,就像一个小人国一样,人类是无法进入他们的世界的,因为太小了。他们有不同的种类的人,不同种类的人具有不同的技能。你可以通过几种特定的方式去获得不同种类的小人--这个小人你可以给他取个名字,钱宝。那么钱宝就可以理解成对象,获得钱宝的过程就是创建对象。)
        (what对象是什么?
        类:类是对现实生活中一类具有共同属性和行为的事物的抽象 
        对象:是能够看得到摸的着的真实存在的实体
		简单理解:类是对事物的一种描述,对象则为具体存在的事物,假如小人国分为 神仙  妖怪  人类,那么“神仙  妖怪  人类”就是类,是抽象的,如果钱宝是个神仙,那么钱宝这个个体就是对象)

第1条:用静态工厂方法代替公有的构造器

     对于类而言,为了让客户端获取它自身的一个实例,最传统的方法就是提供一个公有的构造器,还有一种方法,也应该在每个程序员的工具箱中占有一席之地。类可以提供一个公有的静态工厂方法(static factory method),它只是一个返回类的实例的静态方法。
  
  下面是一个来自Boolean(基本类型boolean的装箱类)的简单示例,这个方法将boolean基本类型值转换成了一个Boolean对象引用:
public static Boolean valueof( boolean a){

        return a ? Boolean.TRUE : Boolean.FALSE;
    }
注意,静态工厂方法与设计模式中的工厂方法(Factory Method)模式不同。本条目中所指的静态工厂方法并不直接对应于设计模式(Design Pattern)中的工厂方法。
类为客户端提供静态工厂方法---提供公有构造器,两种方法相比较,静态工厂方法的5个优势与2个劣势:

5大优势:
1.有名称
probablePrime(probable有可能,Prime素数)这个名称就让使用者知道,使用这个方法有可能返回素数。
用BigInteger(int,int,Random)返回的BigInteger可能为素数(曾称质数。一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数。如2,3,5,7,11,13,17…)。

 public BigInteger(int bitLength, int certainty, Random rnd) {
        BigInteger prime;

        if (bitLength < 2)
            throw new ArithmeticException("bitLength < 2");
        prime = (bitLength < SMALL_PRIME_THRESHOLD
                                ? smallPrime(bitLength, certainty, rnd)
                                : largePrime(bitLength, certainty, rnd));
        signum = 1;
        mag = prime.mag;
    }

如果用probablePrime这个静态工厂方法表示,则更为清楚。

public static BigInteger probablePrime(int bitLength, Random rnd) {
        if (bitLength < 2)
            throw new ArithmeticException("bitLength < 2");

        return (bitLength < SMALL_PRIME_THRESHOLD ?
                smallPrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd) :
                largePrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd));
    }
      一个类只能有一个带有指定签名的构造器(因为构造器名称要与类名相同),我们可以通过重载创建多个构造器,但是他们的名字都是同一个,面对这样的API,用户永远也记不住该用哪个。而且在读到这些代码时,没有参考文档,往往不知所云,可读性很差。
      因为静态工厂方法有名称,可以不受上述限制。可以通过仔细选择名称以便突出静态工厂方法之间的区别。

2.不必每次调用他的时候都创建一个新对象
这使得不可变类(指其实例不能被修改的类,见17条)可以预先构建好的实例,或者将构建好的实例缓存起来,进行重复利用,从而避免创建不必要的重复对象。Boolean.valueOf(boolean b)方法说明了这项技术:它从来不创建对象。这种方法类似于亨元(Flyweight)模式。如果程序经常请求创建相同的对象,并且创建对象的代价很高,则静态工厂方法可以极大的提升性能。
此方法能够重复的调用返回相同的对象,这样有助于类总能严格控制在某个时刻哪些实例应该存在。这种类被称作实例受控的类(instance-controlled)。实例受控使得:
1.类可以确保它是一个Singleton(单例,见3条)
2.类不可实例化。
3.使得不可变的值类可以确保不会存在两个相等的实例,即当且仅当a == b 时, a.equals(b) 才为true.这是亨元模式的基础。枚举(enum,见34条)类型保证类这一点。
3.可以返回原返回类型的任何子类型的对象
这样我们在选择返回对象的类时就有了更大的灵活性。比如API可以返回对象,同时又不会使对象的类变成公有的。以这种方式隐藏实现类会使得API变得非常简洁。这项技术适用于基于接口的框架(interface-based framework),因为在这种框架中,接口为静态工厂方法提供了自然返回类型。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值