【代码优化】私有构造器使用及对象创建优化

1、使用私有构造器或者枚举类型强化singleton

1》单例模式---私有构造器,提供一个公有的成员是一个静态工厂方法:

public class SingleTon{

private static final  SingleTon single=new SingleTon();

private SingleTon(){ }

public static SingleTon getInstance() {

return single;

}

}

工厂方法的优势一在于它提供了灵活性:在不改变其他api的前提下,我们可以改变改类是否应该为singlton的想法。

但是缺点,在于它很容易被修改,比如改成每个调用改方法的线程返回一个唯一实例。优势二与泛型有关。

2》使用枚举类型:

//enum singleton

public enum SingleTon{

SINGLE;

public void leaveTheBuilding(){。。。}

}

功能上与公有域方法相近,更加简洁,无偿提供序列化机制(上面方法没有提供,需要添加一些序列化操作)

绝对防止了多次实例化。

2、通过私有构造器强化不可实例化能力

显示的构造器私有化,不让外部调用,也不能让它实现子类化,(抽象类可以实现本类不可实例化,但是可以通过子

类化,间接的实例化类)。

3、避免不必要的对象创建

最好能重用对象而不是每次都创建一个相同功能的对象。如果对象是不可变的,它始终可以被重用。

一个极端的例子:

String s=new String(“adffdase”);

每次调用都会创建一个新对象,要是在循环里面,创建的对象可想而知,会创建成千上万的不必要的对象实例。

改进:Sting s=“adffdase”;

也可以使用静态工厂方法,我就不多说了。

4、当你从手工管理内存语言转到java开发,程序在用玩对象之后,会被自动回收,这是多么美好的事情,但是,你

不要认为不再考虑内存管理了

看看下面的代码:

public class Stack{

private Object[] obj;

private int size =0;

public Stack(){

obj = new Object[ 16 ];

}

public void push (Object o){

ensureCapacity();

obj [size++]=o;

}

public Object pop(){

if(size ==0){

throw new EmptyStackException();

}

return obj[--size];

}

private void ensureCapacity(){....}

}

这段代码,看起来没问题,测试也不会有问题,功能都正常,但是隐藏着一个问题,有可能引起内存泄露,

随着垃圾回收器活动的增加,内存占用会不断增加,程序的性能也会降低。

内存泄露发生在哪里呢??

如果一个栈先增长,然后收缩,那么从栈中弹出的对象将不会被回收,即使不在使用这些被弹出的

对象,它们也不会被回收。这是因为,栈内部维护者对这些对象的过期引用(永远不会被解除的引用)。

所以,即便是在java中也要主动回收这些垃圾对象。

改进:

public Object pop(){

if(size ==0){

throw new EmptyStackException();

}

Objcet result =obj[--size];

obj[size]=null;//释放掉弹出栈的对象的引用

return result;

}

我们应该在那些情况下需要注意,对象的主动回收呢??

第一,只要类是自己管理内存,程序员就该警惕内存泄露问题。

第二, 内存泄露的另一常见来源是缓存。

第三,监听器和其他回调。如果使用注册回调,记得用完取消注册。

【代码优化】私有构造器使用及对象创建优化,布布扣,bubuko.com

时间: 2024-10-12 19:05:01

【代码优化】私有构造器使用及对象创建优化的相关文章

第二章:创建和销毁对象。ITEM3:用私有构造器或者枚举类型强化Singleton属性。

声明一个Singleton类的3种方法: package com.twoslow.cha2; /** * 可以通过AccessibleObject.setAccessible(),通过反射机制调用私有构造器. * @author sai * */ public class Singleton01 { private Singleton01(){} public static final Singleton01 INSTANCE = new Singleton01() ; private Obje

JavaScript代码优化(下载时间和执行速度优化)

JavaScript代码的速度被分成两部分:下载时间和执行速度. 下载时间 Web浏览器下载的是js源码,因此所有长变量名和注释都回包含在内.这个因素会增加下载时间.1160是一个TCP-IP包中的字节数.最好能将每个javascript文件都保持在1160字节以下以获得最优的下载时间.    由于这个原因,要删除注释.删除制表符和空格.删除所有的换行.将长变量名缩短. 遵循这4条比较困难.因此用外部程序(ECMAScript Cruncher)来帮助我们. 要运行ESC,必使用Windows系

Java私有构造器

Java私有构造器:使用private关键字声明的构造函数.由于类的构造函数时私有的,所以此类不能被实例化,同时也不能被继承.<Effective Java>第三条:用私有构造器或者枚举强化Singleton属性.所谓Singleton属性是指仅仅被实例化一次的类.第四条:通过私有构造器强化不可实例化的能力.在Java中实现Singleton有两种方式: public class Elvis { public static final Elvis INSTANCE = new Elvis();

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

我们在开发中经常会去做一些工具类,这些类中的方法和变量都是static的.而这样的工具类是不希望呗实例化的.然后我们知道jdk会在无构造器的时候,自动的提供一个无参数的缺省构造器.该构造器就会提供给用户一个创建改类对象的接口,因而我们在工具类中会将此构造函数显示化私有化: public class UtilityClass{ private UtilityClass(){ // 用来避免在类内不小心的调用该构造器 throw new AssertError(); } ...... } 该条建议,

java基础---不可变对象创建

通过反射还是可以修改的. public static void stringReflection() throws Exception { String s = "Hello World"; System.out.println("s = " + s); //Hello World //获取String类中的value字段 Field valueField = String.class.getDeclaredField("value"); //改

设计模式---对象创建模式之构建器模式(Builder)

一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 对象的创建:Builder模式是为对象的创建而设计的模式 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法. 二:动机 在软件

第3项:用私有构造器或者枚举类型强化Singleton属性

??Singleton指仅仅被实例化一次的类 [Gamma95].Singleton通常代表无状态的对象,例如函数(第24项)或者本质上唯一的系统组件.使类称为Singleton会使它的客户端测试变得十分困难,因为除非它实现了作为其类型的接口,否则不可能将模拟实现替换为单例. ??实现单例的方法有两种. 两者都基于保持构造函数私有并导出公共静态成员以提供对唯一实例的访问. 在一种方法中,该成员是final字段: // Singleton with public final field publi

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

当需要编写只包含静态方法和静态域的类时,像是java.lang.Math,java.util.Arrays,把基本类型的值或者数组类型上的相关方法组织起来,或者像java.util.Collections,把实现特定接口的对象上的静态方法组织起来. 这样的工具类不希望被实例化,实例对它没有意义. 企图通过将类做成抽象类来强制该类不可被实例化,行不通.因为该类可以被子类化,并且子类可以被实例化. 我们把类的构造器显式声明为私有的,保证在类的外部不能被访问. public class Utility

《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性

Singleton指仅仅被实例化一次的类.一般用来搞那些创建非常耗资源或者要求系统中只能有一个实例的类.这个非常常用.记得以前实习面试的时候就有这个面试题.一般采用的方法是将构造器私有化,然后提供一个static变量,再提供一个static的public方法用来返回static实例: //Singleton with static factory public class Elvis { private static final Elvis INSTANCE = new Elvis(); pri