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关键字而已,但是虚拟机层面上却不是如此.我们看一下在虚拟机层面上创 ...
随机推荐
- IIS6.0 IIS7.5应用程序池自动停止的解决方法
前边提到由win2003升级到win2008 server r2 64位系统,然后用了几个小时配置IIS7.5+PHP+MYSQL等的环境,先是遇到IIS7.5下PHP访问慢的问题,解决之后又出了新的 ...
- 如何用fir.im 命令行工具 打包上传
1.注册fir.拿到token 2.安装 fir-cli 使用 Ruby 构建, 无需编译, 只要安装相应 gem 即可. $ ruby -v # > 1.9.3 $ gem install f ...
- json序列化时datetime的处理方法
.net自带的json序列化器,JavaScriptSerializer和DataContractJsonSerializer,都是序列化成微软的datetime json格式,e.g. " ...
- Yann LeCun, Geoffrey E. Hinton, and Yoshua Bengio
- Delphi 中同类型方法的说明
对象的方法能定义成静态(static).虚拟(virtual).动态(dynamic)或消息处理(message).请看下面 的例子: TFoo = class procedure IAmAStati ...
- Labview调用Python脚本
Labview程序框图如下: Python脚本如下: #!/usr/bin/env pythonimport sys #Command Line Arguements are stored in li ...
- HTML 中级
abbr(表示它所包含的文本是一个更长的单词或短语的缩写形式): <p>This web site is about <abbr title="HyperText Mark ...
- Redux教程2:链接React
通过前面的教程,我们有了简单的环境,并且可以运行Redux的程序,也对 如何编写Redux示例 有了初步的印象: 掌握了 使用Redux控制状态转移 ,继而驱动 React 组件发生改变,这才是学习R ...
- jquery qrcode参数
{ // render method: 'canvas', 'image' or 'div' render: 'canvas', // version range somewhere in 1 .. ...
- 硬件抽象层:HAL
本节我们研究硬件抽象层:HALHAL,它是建立在Linux驱动之上的一套程序库.刚开始介绍了为什么要在Android中加入HAL,目的有三个,一,统一硬件的调用接口.二,解决了GPL版权问题.三,针对 ...