java 对象 :创建
灵感来自effective java
关于对象,是java的核心,如何有效的创建其实是一个值得关注的地方。
1.静态工厂:这是一个值得关注的,并且应该时刻考虑的方法。
优点:1.他是有名字的,这个是如何作为一个优势?假设在一个别人写的类有好几个构造函数,你应该使用哪个?哪个才是最佳的?这时候要是有一个名字就好了,但是普通的构造都是一样的名字。静态构造可以完美解决。2.可以控制对象构建,普通的构造函数只是返回一个本对象,并不能对对象作出控制,比如静态工厂结合私有构造,就可以控制构建对象的数量,也可以把对象构建缓冲池,来进行对象的复用。还有一个技巧,假如参数传递的一致就返回同一个对象。这样对象就可以使用==来比较是否相等了,这在程序优化的时候也未尝不可。3可以屏蔽构建的类返回一个父类型或者是父接口类型,这样做有效的屏蔽细节。4.简化构造,去掉了new的繁琐操作。
缺点:没有公有构造,就不能被子类化,不能突出这是一个构造,因为就是一个普通方法。
2.多个参数问题:当你有多个参数传递的时候,是使用什么方法,减少错误?
1.使用重叠的构造,也就是说根据情况,建立多个含参构造函数。这样可以根据不同的构造函数来构造。但是实在太多了!
2使用javabeans ,使用set和get。但是你有没有想过这样就把对象构造前移了,你可能构造出来的对象不能用,也无法确定那个属性是需要的,哪个属性是不需要的。pass
3.使用builder,构造器就是在你要构造的对象内部建立一个builder内部类专门来构造对象,使用多个设置参数方法,设置属性,然后在使用build构造对象,把对象属性全部拷贝到对象中去。这是结合了前两种的有效方法。
3构建单一对象:也就是单例的,在有了泛型之后,enum Obj{INSTANCE,。。。}成了一个构建单例非常有效的方法。
4.创建不必要的对象,实际上就是适当的时机使用缓存,什么时候使用?当对象的创建是重量级,比如数据库连接,另一种就是对象使用时频繁的,比如Android中的消息通讯的消息,生命周期短,但是需要大量的对象。
还有一个需要关注的就是基本数据类型和String,以前一直疑问他们是否都有缓存,实际上都有,都是在一个常量池中,程序中所有使用到的只有一个,这也就涉及到String是一个final的,不可以变的,一旦要改变就会失效,重新创建。
5内存泄露,关于java中有无内存泄露的问题,这个在android中Context由于生命周期在activity中一旦activity消亡了,但是Conetxt没有释放就会有内存泄露,这样的内存泄露就是指有保持了该对象的引用,而不释放,这主要是在有一定生命周期的对象上尤其要注意。
tip:这里提到一个如何判断引用的方法,垃圾回收器怎么判断?有人说是引用计数器,但是这个是无法解决循环指针的,也就是两个对象保持对方的引用,这样的话都不会释放,但是确实这两个对象都是没有的。实际上是使用了根搜索算法,这个是根据一定的规则判断对象是否在root引用连里面,假如没有就说明,不可能在利用到该对象了。这些规则包括:栈,静态属性引用,常量引用,和本地方法引用。
还有一个就是关于引用:强引用,软引用,弱引用,虚引用。这里面主要的区分点就是这几个对象是和gc紧密联系的,强引用是不会回收的,软引用在内存紧张时候回收,弱引用在垃圾回收的时候回收,虚引用是一定会回收的,和弱引用的区别就是弱引用还可以使用,虚引用对程序员不可见。
java 对象 :创建的更多相关文章
- 深入学习Java对象创建的过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...
- 2.Java对象创建
1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类 ...
- Java虚拟机4:Java对象创建和对象访问
1.对象创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(克隆.反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此.看一下在虚拟 ...
- Java对象创建的过程及对象的内存布局与访问定位
这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 1.类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符 ...
- Java对象创建过程补遗
一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...
- 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式
内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...
- JVM(2)--深入理解java对象创建始终
java对象探秘 java是一门面向对象的语言,我们无时无刻不在创建对象和使用对象,那么java虚拟机是如何创建对象的?又是如何访问对象的?java对象中究竟存储了什么运行时所必需的数据?在学习了ja ...
- HotSpot Java对象创建,内存布局以及访问方式
内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...
- Java对象创建模式
创建Java对象时,对于可为空的属性,创建对象的时候有3种模式:重叠构造器模式.JavaBeans模式.Builder模式(推荐).Stream模式(推荐). ...
- 详述Java对象创建
Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(克隆.反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此.我们看一下在虚拟机层面上创 ...
随机推荐
- daydayup1 codeforces141c
题意:给定n个数字,代表每个人前面有几个人比他高,让你构造一个height数组,满足条件 思路:直接贪心就好,假设到第i个人,设他的高度为i-a[i]+1,前面比他高的人每个人的高度加1
- mysql-front导出数据库字典
直接导出HTML,然后打开HTML最后直接复制到word就可以了!!!之前一直在找navicat如何导出数据字典.现在发现就是这样就可以了!
- 根据序列图像聚焦区域获取深度 Shape From Focus
最为超新新新新鸟...我也不知道第一篇文章应该写什么..所以,把自己最近正在研究的东西报一下吧, 研究的东西其实也不算深奥,就是对一个图像序列中的每张图像进行检测,发现每张图片的聚焦清晰区域,找到这个 ...
- jbpm的学习 出处http://blog.csdn.net/hxirui/article/details/1221911
jbpm入门例子 分类: opensourse2006-09-14 11:30 37308人阅读 评论(22) 收藏 举报 jbpmhibernate数据库oraclemysqltransition ...
- C# ADO.NET 连接Sybase 数据库
using Sybase.Data.AseClient;//反编译修改后的DLL public class SybaseHelper { public AseConnection con; publi ...
- 作业3(PSP表格)
PSP2.1 Personal Software Process Stages Time(min) Planning 计划 11 Estimate 估计 ...
- rocksDB 安装问题简单介绍
前一段时间准备测试rocksdb,按照帖子和官网的例子,在安装过程中遇到一些问题.这里给出的是在Ubuntu下安装python使用的版本. 首先,要感谢这些帖子对我的帮助: 1:http://tech ...
- android开发-小技巧篇(集合)
1.对于过多的控件,功能类似,数量又多的,可以用include方法.在实现应用中,可以把控件放入List集合中. private void initView() { // TODO Auto-gene ...
- 场景7 Data Guard
场景7 Data Guard 官方文档 :Oracle Data Guard Concepts and Administration 用于数据容灾,通过主备库同步(主库将redo日志传送到备库,一个 ...
- 使用JavaScript实现复选框全选与取消的功能
实现效果: html代码: <body> <input type="checkbox" id="checkAll"/>全选<br& ...