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关键字而已,但是虚拟机层面上却不是如此.我们看一下在虚拟机层面上创 ...
随机推荐
- MySql学习(五) —— 数据库优化理论篇(一)
一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...
- java selenium (二) 环境搭建方法一
webdriver 就是selenium 2. webdriver 是一款优秀的,开源的,自动化测试框架. 支持很多语言. 本文描述的是用java Eclipse 如何搭建环境 阅读目录 ...
- Fair Scheduler中的Delay Schedule分析
延迟调度的主要目的是提高数据本地性(data locality),减少数据在网络中的传输.对于那些输入数据不在本地的MapTask,调度器将会延迟调度他们,而把slot分配给那些具备本地性的MapTa ...
- 简单研究下Retrofit
2015-09-24 15:36:26 第一部分: 1. 什么是Retrofit? (点击图片有惊喜) 以上是来自官网的解释,言简意赅,咳咳,我就不翻译了~ 2. 如何使用Retrofit? 2.1 ...
- Bootstrap<基础四> 代码
Bootstrap 允许您以两种方式显示代码: 第一种是 <code> 标签.如果您想要内联显示代码,那么您应该使用 <code> 标签. 第二种是 <pre> 标 ...
- NOIP2016之反面教材提供
NOIP 2016信息竞赛总结 竞赛历程总结: 算下来一共学了11个月的信息竞赛,从最初进来的时候大概会一点最最基础的语法,上课什么也听不懂,然后一直追进度,我想在这个阶段中我的问题主要是自己知道自己 ...
- 如何理解和熟练运用js中的call及apply?
改变this指向 要先明白存在call和apply的原因,才能记得牢一点: 在javascript OOP中,我们经常会这样定义: function cat(){ } cat.prototype={ ...
- 微信APP支付服务端开发Java版(一)
一.准备工作 去微信开发者中心下载(扫码支付,里面的大部分代码是可以用的) https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11 ...
- c++ 之 编译期多态&运行期多态
编译时多态:程序运行前发生的事件 —— 函数重载.运算符重载 .模板 ——静态绑定 运行时多态:程序运行时发生的事件 —— 虚函数机制——动态绑定 template<typename T> ...
- jquery.get()
1.获取当前jquery对象匹配到的dom元素 2.语法: jqueryObject.get([index]) //jQueryObject[index]等价于jQueryObject.get(ind ...