第一节:使用静态工厂方法代替构造函数
将构造函数封装在一个静态的方法中,每次需要一个类的实例时,可以调用静态工厂方法来实现返回一个类的实例。
这样做的好处是:
一、静态的构造方法能够很好的表明类的类型。
二、能够返回某一个实例,该实例可以实现缓存之前的实例,不用每次都创建一个实例。如使用单例模式就能可以实现这种情况。
三、静态工厂方法可以返回任意一个类及类的子类的实例,根据参数的不同。
四、对于一些构造函数的参数过多的构造函数,可以将构造函数封装于一个构造函数
缺点如下:
一、静态工厂方法无法向一般构造函数与其他的一般的函数进行区分。
二、如果使用静态工厂方法代替构造函数,而类中没有构造函数时。该类将无法进行继承
第二节 构造函数的参数太多时,需要使用构建器
对于java类的创建,一般使用构造器。但当构造参数过多时,可以使用重叠构造器的方法。
重叠构造器的方法的缺点是当参数的数量变化时,需要修改大量的代码。代码不够健壮
第二种方法是,javabean模式。先创建出一个类的实例,然后使用setter和getter方法来设定参数的值,也有一些缺点,缺点是该这种创建的方法是线程不安全的。
解决办法是builder构建器,融合以上两种方法的优点。
主要思想是在类中加一个内部类,内部类的变量和类的变量完全一致,创建对象时,首先使用类似于javabean方法来创建内部类,并设定参数,然后在使用类的的构造器方法来创建类对象。
构建器适合所有的类的形式。所以可以使用泛型来实现一个通用的方式。
第三节单例模式
单例模式,可以使用private的构造方法来实现整个类只有一个对象。
其中类的引用需要定义为静态的,使用静态工厂方法来实现单例。其中反射的Access的属性设置可能会使外部能够访问类的私有的构造函数。改进的方法为将该类的构造方法中对于该类的变量进行检查,如果已经实例化过了,则抛出异常
同时可以使用Enum来实现单例。单例实现的单例通过反射无法实现多余的实例。
第四节通过私有构造器强化不可实例化的能力
java中有一些类不需要实例化,也不需要用户实例化,或继承。例如java中的Collections方法,Math方法。不希望被用户调用或实例化,则可以将该类的构造函数设为私有的。
对于java类中如果用户未显式的定义一个构造函数,则编译器会自动的给该类添加一个无参数的构造方法。在java的继承中,子类需要显示的或隐式的调用父类的构造函数,如果父类没有public的构造函数,则无法继承。
第五节 :避免创建不必要的对象
对于java中一些像同的对象或者,不会变化的变量。则使用一次,不要多次创建。
一个例子String str = new String("lee");
其中java中String做了一些特殊的处理。故根本不需要创建d对象。
使用String时直接使用String s ="";即可。
在java中使用静态工厂方法会比使用构造方法性能更优。静态工厂方法会对类的实例的生成进行优化,可能不用每次都生成类的一个实例,例如Singleton。
对于java中一些使用一次的类的实例,可以放在类的静态代码块中进行定义。一些变量的初始化可以放到使用前才定义,可以一定程度上优化性能,但是会将代码搞乱。
在java中自动装箱和自动拆箱的使用。是5.0以后的新特性。基本类型的性能会比装箱以后的类的性能更高。
创建类的代价较高时,可以使用对象池来维持自己的类。来提高类的性能。对于一些简单的类完全没有必要使用对象池来提高性能。但是一些比较重量的类则使用java的对象池类提高性能。例如java中数据库的连接。对象池比较难维护。
第六节 消除过期引用
在java语言中由于有gc器,所以无需像c++一样用户自己进行来及垃圾回收。但是java中还是有“内存泄露”,主要是“过期引用”,“无意识的对象保持”,例如java类中有一个对象数组来实现栈,当出栈是未将该引用清空,则会出现内存泄露。
java内存泄露的原因:
一、类自己管理内存,就需要注意内存泄露问题。一旦元素被释放,则需要将对象的引用清空。
二、内存泄露的另一个原因是缓存将数据放入缓存中忘了删除,过期后依然在缓存中。
三、监听器和其他回调
第七节,尽量不要使用终结方法finalize方法
应为终结方法不会在固定的时刻调用,甚至不会调用。这会将第系统的可移植性,或产生错误。
finalize方法一般会在两种情况下使用
一是,用户可能会忘记关闭一些关键的资源,这时候在终结方法中将关键资源关闭。这样做的优点是起到一个安全网的作用。
二、对于本地的一些非关键性的资源进行关闭。
如论那种情况下使用,都要调用系统的finalize方法。
将构造函数封装在一个静态的方法中,每次需要一个类的实例时,可以调用静态工厂方法来实现返回一个类的实例。
这样做的好处是:
一、静态的构造方法能够很好的表明类的类型。
二、能够返回某一个实例,该实例可以实现缓存之前的实例,不用每次都创建一个实例。如使用单例模式就能可以实现这种情况。
三、静态工厂方法可以返回任意一个类及类的子类的实例,根据参数的不同。
四、对于一些构造函数的参数过多的构造函数,可以将构造函数封装于一个构造函数
缺点如下:
一、静态工厂方法无法向一般构造函数与其他的一般的函数进行区分。
二、如果使用静态工厂方法代替构造函数,而类中没有构造函数时。该类将无法进行继承
第二节 构造函数的参数太多时,需要使用构建器
对于java类的创建,一般使用构造器。但当构造参数过多时,可以使用重叠构造器的方法。
重叠构造器的方法的缺点是当参数的数量变化时,需要修改大量的代码。代码不够健壮
第二种方法是,javabean模式。先创建出一个类的实例,然后使用setter和getter方法来设定参数的值,也有一些缺点,缺点是该这种创建的方法是线程不安全的。
解决办法是builder构建器,融合以上两种方法的优点。
主要思想是在类中加一个内部类,内部类的变量和类的变量完全一致,创建对象时,首先使用类似于javabean方法来创建内部类,并设定参数,然后在使用类的的构造器方法来创建类对象。
构建器适合所有的类的形式。所以可以使用泛型来实现一个通用的方式。
第三节单例模式
单例模式,可以使用private的构造方法来实现整个类只有一个对象。
其中类的引用需要定义为静态的,使用静态工厂方法来实现单例。其中反射的Access的属性设置可能会使外部能够访问类的私有的构造函数。改进的方法为将该类的构造方法中对于该类的变量进行检查,如果已经实例化过了,则抛出异常
同时可以使用Enum来实现单例。单例实现的单例通过反射无法实现多余的实例。
第四节通过私有构造器强化不可实例化的能力
java中有一些类不需要实例化,也不需要用户实例化,或继承。例如java中的Collections方法,Math方法。不希望被用户调用或实例化,则可以将该类的构造函数设为私有的。
对于java类中如果用户未显式的定义一个构造函数,则编译器会自动的给该类添加一个无参数的构造方法。在java的继承中,子类需要显示的或隐式的调用父类的构造函数,如果父类没有public的构造函数,则无法继承。
第五节 :避免创建不必要的对象
对于java中一些像同的对象或者,不会变化的变量。则使用一次,不要多次创建。
一个例子String str = new String("lee");
其中java中String做了一些特殊的处理。故根本不需要创建d对象。
使用String时直接使用String s ="";即可。
在java中使用静态工厂方法会比使用构造方法性能更优。静态工厂方法会对类的实例的生成进行优化,可能不用每次都生成类的一个实例,例如Singleton。
对于java中一些使用一次的类的实例,可以放在类的静态代码块中进行定义。一些变量的初始化可以放到使用前才定义,可以一定程度上优化性能,但是会将代码搞乱。
在java中自动装箱和自动拆箱的使用。是5.0以后的新特性。基本类型的性能会比装箱以后的类的性能更高。
创建类的代价较高时,可以使用对象池来维持自己的类。来提高类的性能。对于一些简单的类完全没有必要使用对象池来提高性能。但是一些比较重量的类则使用java的对象池类提高性能。例如java中数据库的连接。对象池比较难维护。
第六节 消除过期引用
在java语言中由于有gc器,所以无需像c++一样用户自己进行来及垃圾回收。但是java中还是有“内存泄露”,主要是“过期引用”,“无意识的对象保持”,例如java类中有一个对象数组来实现栈,当出栈是未将该引用清空,则会出现内存泄露。
java内存泄露的原因:
一、类自己管理内存,就需要注意内存泄露问题。一旦元素被释放,则需要将对象的引用清空。
二、内存泄露的另一个原因是缓存将数据放入缓存中忘了删除,过期后依然在缓存中。
三、监听器和其他回调
第七节,尽量不要使用终结方法finalize方法
应为终结方法不会在固定的时刻调用,甚至不会调用。这会将第系统的可移植性,或产生错误。
finalize方法一般会在两种情况下使用
一是,用户可能会忘记关闭一些关键的资源,这时候在终结方法中将关键资源关闭。这样做的优点是起到一个安全网的作用。
二、对于本地的一些非关键性的资源进行关闭。
如论那种情况下使用,都要调用系统的finalize方法。