java-对象的创建

一、考虑用静态工厂方法来替代构造器

  • 静态工厂与设计模式中的工厂方法模式不同
  • 与构造器比第一大优势:他们有具体的名称,而不是类名
  • 与构造器比第二大优势:不必在每次调用它的时候都创建一个新对象
  • 与构造器比第三大优势:它可以返回原返回类型的任何子类型的对象
  • 与构造器比第四大优势:在创建参数化实例时,可以使代码变得更加简洁

举例如下:

  1 public static Boolean valueof(boolean a){
  2 		return a?Boolean.TRUE:Boolean.FALSE;
  3 	}

二、服务提供者框架

  • 服务接口:提供者实例
  • 提供者注册API:系统用来注册实现,让客服端访问它们
  • 服务访问API:客服端用来获取服务的实例,是一个灵活的静态工厂

举例如下:

  1 public interface Service{
  2 		//service-specific methods go here
  3 	}
  4
  5 	public interface Provider{
  6 		Service newService();
  7 	}
  8
  9 	public  class Services{
 10 		private Services(){}
 11
 12 		private static final Map<String, Provider> providers=new ConcurrentHashMap<String, Provider>();
 13 		public static final String DEFAULT_PROVIDER_NAME="<def>";
 14
 15 		//provider registration API
 16 		public static void  registerDefaultProvider(Provider p){
 17 			registerProvider(DEFAULT_PROVIDER_NAME, p);
 18 		}
 19 		public static void registerProvider(String name,Provider p){
 20 			providers.put(name, p);
 21 		}
 22
 23 		//service access API
 24 		public static Service newInstance(){
 25 			return newInsance(DEFAULT_PROVIDER_NAME);
 26 		}
 27 		public static Service newInsance(String name){
 28 			Provider provider= providers.get(name);
 29 			if(provider==null){
 30 				throw new IllegalArgumentException("No provider registered with name:"+ name);
 31 			}
 32 			return provider.newService();
 33 		}
 34 	}
 35 

三、Builder 模式

  • 当遇到多个构造器参数时考虑使用构建器
  • 与重叠构造器模式、JavaBean模式相比,既能保证像重叠构造器模式那样安全,又能保证JavaBeans模式那么好的可读性,而且也更易于扩展
时间: 2024-10-12 21:38:51

java-对象的创建的相关文章

图解java对象的创建过程

前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能真正看明白).经常有人问我为什么这么喜欢钻研底层的东西,首先,因为我以前的做硬件的和嵌入式的,兴趣使然:其次,我个人感觉,如果不把上下打通,心里老是有一堵墙过不去,说白了,这是个人因素,与好坏无关(当然,经常有人说,懂底层原理是成为高手的必经之路). 现在来说一下我当初学习JVM的原因,在学习JAV

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅

(转)深入理解Java对象的创建过程

参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化.在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化.本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机

java虚拟机学习(二)java对象的创建及访问定位

java对象的创建过程: 对象的创建开始: 虚拟机遇到new 关键字的时候,首先去常量池中寻找有没有这个类的符号引用,并且检查该引用的类是否已经被加载,解析,和初始化过,如果没有则会先执行该类的加载过程, 在通过检查后,虚拟机为该新生对象分配内存. 分配内存: 为对象分配内存有俩种方式: 一种分配方式是"指针碰撞",在内存规整的时候,已使用的内存在一侧,未使用的内存在一侧时,中间为指示器指针,这个时候的内存分配就是把指示器指针向未使用的区域移动至创建的对象大小相等的距离. 另一种分配方

Java 对象的创建过程

类的初始化与实例化一个 Java 对象的创建过程往往包括类的初始化 和 实例化 两个阶段.Java 规范规定一个对象在可以被使用之前必须要被正确地初始化.在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化.在实例化一个对象时,JVM 首先会检查相关类型是否已经加载并初始化,如果没有,则 JVM 立即进行加载并调用类构造器完成类的初始化.Java 对象的创建方式一个对象在可以被使用之前必须要被正确地实例化.在 Java 程序中,有多种方法可以创建对象,最直接的一种就是使用 new 关

Java对象的创建 —— new之后JVM都做了什么?

Java对象创建过程 1. 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有则进行相应的类加载过程.(我之后会写一篇关于类加载顺序和过程的博客,并在此补充连接地址) 2. 分配内存空间 类加载检查通过之后,JVM将为新生对象在堆中分配内存.对象所需内存的大小在类加载完成后已经完全确定了(关于怎样计算对象所需内存大小我稍后会写一篇博客并补充链接).为对象分配空间就相当于在J

Java对象的创建

学了很久的java,是时候来一波深入思考了.比如:对象是如何在JVM中创建,并且被使用的.本文主要讲解下new对象的创建过程.要想更深入的了解建议去认认真真的看几遍<深入理解Java虚拟机>周志明写的. 首先自己想想:Person p = new Person() 这句话是干嘛的?废话,肯定是创建一个新对象的,那么JVM是怎么帮你创建的呢?在哪创建的?怎么在堆上分配内存的?你又是如何去根据变量找到对应的对象的?带着这些问题,继续往下看: 一.找到能生成对象的Class类 对象又不是孙猴子,石头

【深入理解JVM】:Java对象的创建、内存布局、访问定位

对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流程如下: 1. 类加载检查 JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类的加载过程. 2. 对象分配内存 对象所需内存的大小在类加载完成后便完全确定(对象内存布局),

[ Java学习基础 ] Java对象的创建和销毁

类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别,语法格式如下: type objectName; 其中type是引用类型,即类.接口和数组.示例代码如下: String name; 该语句声明了字符串类型对象name.可以声明并不为对象分配内存空间,而只是分配一个引用. 实例化 实例化过程分为两个阶段:为对象分配内存空间和初始化对象,首先使用n

深入理解Java虚拟机(二)、Java对象的创建,内存布局和访问定位

对象的创建: Object obj = new Object(); 常量池中是否有Ljava.lang.Object