展会信息港展会大全

java编程中创建对象和销毁对象 android开发教程
来源:互联网   发布日期:2016-01-19 12:32:40   浏览:2687次  

导读:创建和销毁对象:何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作。1 考虑用静态工厂方法代替构造器获取类的2种方法:1 提供一个公 ...

创建和销毁对象:何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作。

1.考虑用静态工厂方法代替构造器

获取类的2种方法:1.提供一个公有的构造器;2.类提供一个公有的静态工厂方法,它只是一个返回类的实例的静态方法。如:

public static Boolean valueOf(boolean b){

return b?Boolean.TRUE:Boolean.FALSE;

}

静态工厂方法较构造器的优势:

* 静态工厂有名称

当一个类需要多个带有相同签名的构造器时,就用静态工厂代替构造器来使用不同的名称来区分。

* 不必每次调用的时候都创建一个新对象 静态工厂方法能为重复调用返回相同对象,由于创建对象的代价很高,这样极大地提高了性能。而且它还可以使不可变的类可以确保不会出现两个相等的实例,即当且仅当a==b时a.equals(b)为true。这样就可以使用==替换equals来提升性能。

* 它可以返回原返回类型的任何子类型的对象 这项技术适用于基于接口的框架,因为在该框架中,接口为静态工厂方法提供了自然返回类型。接口不能有静态方法,因此按照惯例,接口Type的静态工厂方法被放在一个名为Types的不可实例化的类。

* 在穿件参数化类型实例的时候,它们使代码更加简洁 在调用参数化的构造器时,即使类型参数很明显,也必须指明,这通常要求你接连两次提供类型参数:Map<String,List<String>> m=new HashMap<String,List<String>>(); 但使用静态工厂方法,编译器可以替你找到类型参数。这被称作类型推导(type inference).假设HashMap提供这个静态工厂:

public static <k,v> HashMap<k,v> newInstance(){

return new HashMap<k,v>;

}

则可以使用以下简洁的代码代替上述繁琐的

Map<String,List<String>> m=HashMap.newInstance();

静态工厂方法的缺点

* 类如果不含公有的或保护的构造器,就不能被子类化

* 静态工厂方法与其他的静态方法实际上没有任何区别

2.遇到多个构造器参数时要考虑用构建器(重叠构造器模式,JavaBeans模式,Builder模式)

静态工厂和构造器有个共同的局限性:不能很好地扩展到大量的可

选参数。如:一个类有很多参数,几个必选参数和一堆可选参数。程序员意向习惯采用重叠构造器(telescoping constructor)模式,在这种模式下,你提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个有2个可选参数,以此类推,最后一个构造器包含所有可选参数。这类情况,一般的开发者会用**重叠构造器**

public class NutritionFacts{

private final int servingSize;//必选参数

private final int serving;//可选参数

private final int fat;//可选参数

public NutritionFacts(int servingSize){

this(servingSize,0);

}

public NutritionFacts(int servingSize,int serving){

this(servingSize,serving,0);

}

public NutritionFacts(int servingSize,int serving,int fat){

this.servingSize=servingSize;

this.serving=serving;

this.fat=fat;

}

}

这种构造器通常需要许多哦你本不想设置的参数,但还是必须给他们传值。譬如说只需要 servingSize和fat,则要用new NutritionFacts(5,0,10)的中间的0.

一句话重叠构造器模式可行,但当有很多参数的时候,客户端代码会很难编写,而且难以阅读

遇到许多构造器参数时,可以用第二种代替方法:**JavaBeans模式**。在这种模式下,调用一个无参构造器来创建对象,然后用setter 方法来设置每个必要的参数,以及每个可选参数:

public class NutritionFacts{

private int serviceSize=-1;

private int servings=-1;

private int fat=0;

public NutritionFacts(){}

//setters

public void setServingSize(int val){servingSize=val;}

public void setServings(int val){servings=val;}

public void setFat(int val){fat=val;}

}

这种模式弥补了重叠构造器的不足。即创建实例很容易,读起来也很容易:

NutritionFacts cocaCola=new NutritionFacts();

cocaCola.setServingSize(240);

cocaColar.setFat(20);

遗憾的是,JavaBeans模式自身有着很严重的缺点。因为构造的过程被分到几个调用中,在构造过程中JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性来保证一致。视图使用不一致状态的对象将导致失败,这种失败与包含错误的代码大相径庭,因此调试起来很困难。另一点不足是JavaBeans模式阻止了把类做成不可变的可能,只就需要我们付出额外的努力来确保它的线程安全。

第三种代替方法既能保证像重叠构造器模式那样安全又能像JavaBeans有很好的可读性。就是**Builder模式**。不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或静态工厂)得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法来设置每个相关的可选参数。最后,客户端调用无参的builder方法来生成不可变的对象。这个builder是它构建的类的静态成员类:

public class NutritionFacts{

//注意NutritionFacts这个类是不可变的,都是静态成员

private final int servingSize;

private final int servings;

private final int fat;

public static class Builder{

//Requierd parameter

private final int servingSize;

//Optional parameter

private final int servings;

private final int fat;

public Builder(int servingSize){

this.servingSize=servingSize;

}

public Builder servings(int val){

servings=val;

return this;

}

public Builder fat(int val){

fat=val;

return this;

}

public NutritionFacts build(){

return new NutritionFacts(this);

}

}

private NutritionFacts(Builder builder){

servingSize=builder.servingSize;

servings=builder.servings;

fat=builder.fat;

}

}

注意NutritionFacts是不可变的,所有的默认参数都单独放在一个地方。builder的 setter方法返回builder本身,以便可以把调用链接起来。

NutritionFacts cocaCola=new NutritionFacts.Builder(100).fat(20).build();

赞助本站

人工智能实验室
相关内容
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港