灵感来自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 对象 :创建的更多相关文章

  1. 深入学习Java对象创建的过程:类的初始化与实例化

    在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...

  2. 2.Java对象创建

    1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类 ...

  3. Java虚拟机4:Java对象创建和对象访问

    1.对象创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(克隆.反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此.看一下在虚拟 ...

  4. Java对象创建的过程及对象的内存布局与访问定位

    这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 1.类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符 ...

  5. Java对象创建过程补遗

    一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...

  6. 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式

    内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...

  7. JVM(2)--深入理解java对象创建始终

    java对象探秘 java是一门面向对象的语言,我们无时无刻不在创建对象和使用对象,那么java虚拟机是如何创建对象的?又是如何访问对象的?java对象中究竟存储了什么运行时所必需的数据?在学习了ja ...

  8. HotSpot Java对象创建,内存布局以及访问方式

    内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...

  9. Java对象创建模式

    创建Java对象时,对于可为空的属性,创建对象的时候有3种模式:重叠构造器模式.JavaBeans模式.Builder模式(推荐).Stream模式(推荐).                     ...

  10. 详述Java对象创建

    Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(克隆.反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此.我们看一下在虚拟机层面上创 ...

随机推荐

  1. .NET小细节

    1.equals()和运算符==的区别 C#中有两种不同的相等:引用相等和值相等.值相等是两个对象包含相同的值:引用相等是两个对象引用的是同一个对象. “==”操作符比较的是两个变量的值是否相等,或两 ...

  2. Windows Store App JavaScript 开发:选取文件和文件夹

    前面提到过,文件打开选取器由FileOpenPicker类表示,用于选取或打开文件,而文件夹选取器由FolderPicker类表示,用来选取文件夹.在FileOpenPicker类中,pickSing ...

  3. Tableau修改参考线上显示的标签

    修改Tableau中参考线上的标签显示内容,如下图所示:可根据自定义调整

  4. java 文件按行读取

    /*代码写的可能有点累赘里面的好多东西写的不太好 还望各位大佬能提点一二,不胜感激*/package com.zzp.fileopration;import java.io.*;/** * Creat ...

  5. 【 2013 Multi-University Training Contest 8 】

    HDU 4678 Mine 对于每个空白区域,求SG值. 最后异或起来等于0,先手必败. #pragma comment(linker,"/STACK:102400000,102400000 ...

  6. python学习——将while循环改成函数

    笨办法学python第33节 这一节主要学习内容是while循环,记录内容为将while改成函数,首先源代码如下: i = 0 numbers = [] while i < 6: print & ...

  7. 同表复制修改日期的procedure

    同表复制数据,让其日期增加 算出总共的天数,用group by 分类后的. space 提前求出第一块数据的总和 sum = select count(*) from tbl_event; 固定操作第 ...

  8. app标配控制器:UITabBarController

    UITabBarController UITabBarController和UINavigationController类似可以轻松的管理多个控制器,底部有一个条,底部条tabBar的高度是49. U ...

  9. STM32——外部中断EXIT实现

    外部中断实现步骤: 一.初始化,包括:1.AFIO时钟中断和GPIO时钟使能:                          2.GPIO初始化                           ...

  10. iOS 判断View 是否是第一次显示

    在实现某些需求的时候会有这样的情况,页面第一次加载显示的时候需要某些操作,而以后就不需要重复执行了, 一般这种处理都放在- (void)viewDidLoad或- (id)init因为一般这两个函数除 ...