![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective Java
文章平均质量分 53
NoExceptionSir
这个作者很懒,什么都没留下…
展开
-
《Effective Java》避免创建不必要的对象
经典问题:这两行创建了几个对象?第一行创建了几个,第二行创建了几个?第一行创建了一个对象,第二行也是创建了一个对象。引用一共有两个,一个在虚拟机栈的栈帧的局部变量表中,另一个是在全局字符串池中(StringTable,本质上是个哈希表,池的位置视JDK的版本而定,1.6版本在方法区,1.7版本在堆,1.8从堆里面独立,被称为元空间),这个池中只保留被双引号修饰的字符串引用,实际对象还是存储在堆...原创 2018-03-23 14:08:21 · 298 阅读 · 0 评论 -
《Effective Java》覆盖equals()时总是要覆盖hashcode()
在Object类中的注释写到: - 在java应用执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一对象调用多次hashCode方法都必须始终如一地同一个整数。在同一个应用程序的多次执行过程中,每次执行该方法返回的整数可以不一致。如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样...原创 2018-03-23 15:21:57 · 334 阅读 · 0 评论 -
《Effective Java》读书笔记(已更新至24条)
《Effective Java》读书笔记目录,这篇文章记录了我读这本书的一些想法和验证,带水印刘屠户的java养猪场是我的公众号,考虑后面的源码解析同步到公众号中。1. 考虑用静态工厂方法代替构造器第一条,考虑用静态工厂方法代替构造器优点一:静态工厂可以很好的理解名称四个构造方法,面对这样的构造方法,三个、四个是可以接受的,那如果是七个八个甚至是十几个呢?这个时候有一个好的...原创 2018-03-23 14:15:01 · 1208 阅读 · 0 评论 -
《Effective Java》避免使用finalize()方法
首先说一下finalize()方法用来做什么,这是一个Object类的方法,也就是说所有类都会继承这个finalize()方法,这个方法默认实现为空,这个方法被用于在类对象被GC之前做一些收尾工作,但是被执行是有条件的,类重写的finalize()方法必须不为空。首先JVM会先判断这个类是否重写了finalize()方法,并且这个方法不为空,如果满足这个条件会被标记。在java.lang....原创 2018-03-23 14:12:15 · 522 阅读 · 0 评论 -
《Effective Java》消除过期的引用
引用书中的例子代码 这段代码是有内存泄漏的隐患的,主要原因在pop()方法,pop()方法将一个元素从栈中弹出后,虽然size减少了,但是elements[]数组还持有着弹出元素的引用,从而引发内存泄漏。解决办法是可以手动将这个元素的引用置为null。 显然在写代码的时候不可能一直关注着引用,发现不用就置为null,这是不可取的,那么在什么时候应该注意引用的手动释放(也就是置为...原创 2018-03-23 14:11:50 · 388 阅读 · 0 评论 -
《Effective Java》考虑用静态工厂方法代替构造器
第一条,考虑用静态工厂方法代替构造器优点一:静态工厂可以很好的理解名称四个构造方法,面对这样的构造方法,三个、四个是可以接受的,那如果是七个八个甚至是十几个呢?这个时候有一个好的名字就是十分重要,比如书上提到的返回素数的方法名称:BigInteger.probablePrime(),这样的名称就可以很好地区分构建实例的用途,可读性也更强。优点二:不必每次调用它们的时候都创建一个新的...原创 2018-03-23 14:11:26 · 363 阅读 · 0 评论 -
《Effective Java》遇到多个构造器参数时要考虑用构造器
如果一个对象有多个参数时,应该如何处理?代码大全2中提到过,一个函数的参数最好不要超过7个,我们熟悉的线程池参数就是7个,构造方法也不例外,在笔记本电脑中,一屏幕代码最多也就是7个左右的参数。构建一个对象,通常我们会如何处理呢?1、构造函数,下面的类BuilderDemo有8个属性 这样的代码是十分冗长的,如果有多个构造函数的话,是十分混乱的。于是我们有个新的想法,创建这些属...原创 2018-03-23 14:10:57 · 305 阅读 · 0 评论 -
《Effective Java》用私有构造器或者枚举类型强化SingleTon属性
我们耳熟能详的单例有懒汉式、饿汉式等 例如下面这段的饿汉式 用private修饰构造方法,防止外界通过无参的构造方法直接创建对象,但是这样还是可以通过反射来攻击,造成代码的不安全,可以考虑设定一个变量,在创建第二个对象的时候抛出一个自定义的异常。这样就安全了吗? 如果我将这个对象序列化到本地,然后再反序列化回来,这个对象还是原来的对象吗?不是的,这时可以考虑使用序列化的hock函数r...原创 2018-03-23 14:10:25 · 370 阅读 · 0 评论 -
《Effective Java》通过私有构造器强化不可实例化的能力
一些类是不希望其他类对它实例化的,比如java.util.Arrays、java.lnag.Math、java.util.Collections。我们发现这些类都会声明一个私有的构造方法,这样外界就无法通过默认无参的构造方法来创建这些类的对象,同时这些类也不能被继承。 我们知道抽象类也是不可以被实例化的,那么为什么不使用抽象类呢? 抽象类是可以有子类的,而且抽象类的出现可能会让人误...原创 2018-03-23 14:09:55 · 290 阅读 · 0 评论 -
《Effective Java》谨慎的覆盖clone()方法
首先说一些,clone()是什么?应该怎么用? clone()方法是Object类中的方法,protected修饰符修饰,用来复制对象。下面是结果:可以看到clone()创建了一个完全不同的对象,t2指向了一个新的在堆中的对象。使用clone()方法需要实现Cloneable接口,如果不实现的话会抛出CloneNotSupportedException,这个接口并没有什么实际意义,只...原创 2018-03-24 22:00:23 · 346 阅读 · 0 评论