![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
effective java
文章平均质量分 91
haikuotiankongdong
这个作者很懒,什么都没留下…
展开
-
《Effective Java》阅读笔记 18接口优于抽象类
接口和抽象类抽象类允许某些方法的实现,但是接口不允许(JDK 1.8 已经运行了)现有类必须成为抽象类的子类,但是只能单继承,接口可以多继承抽象类小优势抽象类并非一无是处,它的改变就比接口要简易的多,实际使用时也是体验很好的一种设计方法,不过抽象类的使用也要有所衡量,只有在确实是属于一个类别的类时才好去使用抽象类,否则就违背了我们的编程原则接口优点现有类可以很容易被更新,以实现新的接口只需要在接口中添加方法就可以了接口是定义 mixin (混合类型)的理想选择mixin:类除了原创 2021-05-21 19:34:26 · 321 阅读 · 2 评论 -
《Effective Java》阅读笔记 17要么为继承而设计,并提供文档,要么就禁止继承
面向对象编程,从一开始被洗脑难免在上手写代码时都会首先思考有没有公共方法啊,能不能把两个类抽象成一个父类再继承啊等,慎重使用继承,当要使用继承时一定要在文档注释中写明重写这个方法会给其他方法带来什么影响。书中给出建议如果类并不是为了继承而生,那么这个类应该用final修饰禁止子类化。1.继承的缺陷对于为了继承而设计的类,唯一的测试方法就是编写子类。为了继承,类还必须遵守其他一些约束。构造器绝不能调用可被覆盖的方法,无论是直接调用还是间接调用。无论是clone还是readObject,都不可以调用可原创 2021-05-21 18:01:05 · 161 阅读 · 0 评论 -
《Effective Java》阅读笔记 15使可变性最小化
1.不可变类的优势不可变类只是其实例不能被修改的类。不可变的类比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全。Java 平台类库包含许多不可变的类,包括 String 类、基本类型包装类以及 BigInteger 类和 BigDecimal 类。 有很多很好的理由:不可变类比可变类更易于设计,实现和使用。 他们不容易出错,并且更安全。2.如何设计不可变类1.不要提供任何会修改对象状态的方法。2.保证类不会被扩展。3.使所有的域都是 final 的。4.使所有的域都是私有的。5.原创 2021-05-19 20:11:45 · 220 阅读 · 2 评论 -
《Effective Java》阅读笔记 14在公有类中使用访问方法而非公有域
1.问题class Point { public double x; public double y;}}如果直接将类中的域暴露为共有域,那么你将失去这个域的控制权。如果你以后想要在类中记录x被赋值了多少次和被获取了多少次,你将无法做到,因为你根本不知道它什么时候在外部被获取,什么时候再外部被赋值。2.解决办法class Point { private double x; private double y; public Point(double x, d原创 2021-04-26 20:46:46 · 142 阅读 · 0 评论 -
《Effective Java》阅读笔记 13使类和成员的可访问性最小化
1.信息隐藏区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其内部数据和其他实现细节。设计良好的组件会隐藏所有的实现细节,把API与实现清晰地隔离开来。然后模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况。这种概念被称为 信息隐藏 或者 封装,是软件设计地基本原则之一。信息隐藏之所以非常重要有许多原因,其中大多是因为:它可以有效地解除组成系统地各组件之间地耦合关系,即解耦,使得这些组件可以独立地开发、测试、优化、使用、理解和修改。2.为原创 2021-04-26 19:59:26 · 221 阅读 · 0 评论 -
《Effective Java》阅读笔记12 考虑实现Comparable接口
1.序Comparable接口public interface Comparable<T> { public int compareTo(T o);}现在对comparaTo()方法进行简单说明。comparaTo()方法传入该类的另外一个实例,返回一个int值,这个方法每执行一次都是对传入的对象和和本生对象进行比较。返回的int值如果是一个正值(不包括零)则在数组或是集合中交换两个实例的位置,否则位置保持不变。CompareTo方法返回三个结果,1,0,-1,那么它们分别原创 2021-04-26 15:27:20 · 197 阅读 · 0 评论 -
《Effective Java》阅读笔记 11谨慎地覆盖clone
1.序Object 中 clone 方法的定义是:protected native Object clone() throws CloneNotSupportedException;调用clone()方法需要对象实现Cloneable接口,该接口决定了Object中受保护的clone方法的实现行为:如果一个类实现了Cloneable接口,Object的clone方法返回该对象的逐域拷贝;如果一个类未实现Cloneable接口,则该对象就会抛出CloneNotSupportedException原创 2021-04-26 11:08:32 · 198 阅读 · 0 评论 -
《Effective Java》阅读笔记10 始终要覆盖toString
1.为什么要覆盖toString方法?public class Person { protected String name; protected int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public vo原创 2021-04-25 09:09:46 · 132 阅读 · 1 评论 -
《Effective Java》阅读笔记9 覆盖equals时总要覆盖hashCode
1. 什么是hashcode方法?hashcode方法返回对象的哈希码值在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有改变,那么对于这同一个对象调用多次,hashcode方法都必须返回同一个整数。hashcode的存在主要用于查找的快捷性,如Hashtable,HashMap等,hashcode是用来在散列存储结构中确定对象的存储地址的。2. hashcode相等与对象相等之间的关系:(保证设计是规范的前提下)如果两个对象相同,那么两个对象的hashcode也原创 2021-04-21 17:20:41 · 188 阅读 · 4 评论 -
《Effective Java》阅读笔记8 覆盖equals方法请遵守通用约定
1.序2.不需要覆盖equals的情景类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说确实如此,例如Thread。Object提供的equals实现对于这些类来说正是正确的行为。不关心类是否提供了“逻辑相等(logical equality)”的测试功能。例如,java.util.Random覆盖了equals,以检查两个Random实例是否产生相同的随机数序列,但是设计者并不认为客户需要或者期望这样的功能。在这样的情况下,从Object继承得到的equals实现已经足原创 2021-04-21 11:28:22 · 217 阅读 · 0 评论 -
《Effective Java》阅读笔记7 避免使用终结方法
1.序终结方法(Finalizer)是不可预知的,很多时候是危险的,而且一般情况下是不必要的。Java 9 中终结方法已经被遗弃了,但它们仍被Java类库使用,清理方法替代了终结方法比起终结方法,清理方法相对安全点,但仍是不可以预知的,运行慢的,而且一般情况下是不必要的。学习过C++的同学看到终结方法(finalizer)应该马上就能想到C++中的析构函数(destructor)。Java中的终结方法和C++中的析构函数类似,会在对象被垃圾回收之前执行,也就是对象被销毁之前执行。在C++中,原创 2021-04-20 19:50:07 · 182 阅读 · 0 评论 -
《Effective Java》阅读笔记6 消除过期的对象引用
1.序如果有同学接触过C/C++,应该会对内存空间的回收有着深刻的印象。举一个典型的例子——删除C语言链表。void deleteList(list l){ position p, temp; p = l->next; l->next = NULL; while(p != NULL) { temp = p->next; free(p); // 释放掉结点占用的内存空间 p = te原创 2021-04-16 17:16:05 · 174 阅读 · 0 评论 -
《Effective Java》阅读笔记5 避免创建不必要的对象
1.序尽量少的创建对象,如果单个对象能够满足要求,就使用单例模式,反复重用唯一的对象。对一些创建成本低的对象来说,这样做带来的好处也许并不明显。但对于一些创建成本高的对象来说,这样做可以明显地节约系统资源、提升系统性能。有以下几种方法:1 采用更合适的API或工具类减少对象的创建2 重用相同功能的对象3 小心自动装箱(auto boxing)4 用静态工厂方法而不是构造器2. 采用更合适的API或工具类减少对象的创建可能导致滥用对象的一个典型例子就是 字符串 。在学习Java基础的过程中,原创 2021-04-15 20:48:31 · 195 阅读 · 0 评论 -
《Effective Java》阅读笔记4 通过私有构造器强化不可实例化的能力
1.序在第三节中,我们学习了如何通过不同的方法强化Singleton,但并非所有的类都是需要实例化的。有时候,我们可能需要编写至包含静态方法和静态域的类。这些类的名声很不好,因为有些人在面向对象的语言中滥用这样的类来编写过程化的程序。尽管如此,它们也确实有它们特有的好处:1.利用这种类,以java.lang.Math或者java.util.Arrays的方式,把基本类型的值或者数组类型上的相关方法组织起来.2.我们也可以通过java.util.Collections的方式,把实现特定接口的对象上的原创 2021-04-14 10:12:25 · 186 阅读 · 0 评论 -
《Effective Java》阅读笔记3 用私有构造器或者枚举类型强化Singleton属性
1.序点击直达------->>>单例模式的正确使用方式单例(singleton)指仅仅被实例化一次的类。单例对象通常表示无状态对象,如函数或本质上唯一的系统组件。使类成为单例会使测试它的客户端变得困难,因为不可能用模拟实现代替单例,除非它实现一个充当其类型的接口。2. 静态成员方式public class Singleton { public static final Singleton singleton = new Singleton(); private原创 2021-04-13 17:46:04 · 257 阅读 · 0 评论 -
《Effective Java》阅读笔记2 遇到多个构造器参数时要考虑用构造器
学习目标:提示:这里可以添加学习目标例如:一周掌握 Java 入门知识学习内容:例如:1、 搭建 Java 开发环境2、 掌握 Java 基本语法3、 掌握条件语句4、 掌握循环语句学习时间:提示:这里可以添加计划学习的时间例如:1、 周一至周五晚上 7 点—晚上9点2、 周六上午 9 点-上午 11 点3、 周日下午 3 点-下午 6 点学习产出:提示:这里统计学习计划的总量例如:1、 技术笔记 2 遍2、CSDN 技术博客 3 篇3、 学习的 vlog 视原创 2021-04-13 16:06:50 · 114 阅读 · 0 评论 -
《Effective Java》阅读笔记1 考虑使用静态工厂方法替代构造方法
1.序对于一个类,要获取它的一个实例,通常的做法是提供一个公用的构造函数,然而还有另一种方法,我们称之为静态工厂方法,实质上也就是一个简单的静态方法,它返回一个类的实例。其实,静态工厂方法获取对象实例,我们并不陌生,来看两个例子。构造方法创建对象在Java中,创建对象常用的方法是通过公有构造方法创建;举个例子:如下,是Boolean类的一个构造方法,以及通过该构造方法创建一个Boolean对象; public Boolean(String s) { this(toBoolean(原创 2021-04-12 18:52:36 · 209 阅读 · 0 评论 -
《Effective Java》阅读笔记66 同步访问共享的可变数据
《Effective Java》阅读笔记66 同步访问共享的可变数据关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块。Java规范保证对一个变量的读操作或者写操作是原子性(atomic,注意 i++是非原子性的,64位的long型或double型变量的读写操作也是非原子性的),但并不保证一个线程写入的值对另一个线程是可见的。参考避免使用Thread.stop()方法,而是采用轮询(poll)机制来终止一个线程。如果只需要线程间的交互通信,而不需要原创 2020-11-05 15:42:02 · 126 阅读 · 0 评论 -
long,double在多线程中的情况
java的内存模型只保证了基本变量的读取操作和写入操作都必须是原子操作的,但是对于64位存储的long和double类型来说,JVM读操作和写操作是分开的,分解为2个32位的操作,这样当多个线程读取一个非volatile得long变量时,可能出现读取这个变量一个值的高32位和另一个值的低32位,从而导致数据的错乱。要在线程间共享long与double字段必须在synchronized中操作或是声明为volatile。这里使用volatile,保证了long,double的可见性,那么原子性呢?其实vo原创 2020-11-05 15:32:03 · 486 阅读 · 0 评论 -
《Effective Java》阅读笔记18 接口优先于抽象类
《Effective Java》阅读笔记18 接口优先于抽象类原创 2020-11-05 10:05:07 · 210 阅读 · 0 评论 -
《Effective Java》阅读笔记16 复合优先于继承
《Effective Java》阅读笔记16 复合优先于继承https://blog.csdn.net/qq_35635356/article/details/7965495原创 2020-11-03 15:52:07 · 206 阅读 · 0 评论 -
《Effective Java》阅读笔记1 考虑使用静态工厂方法替代构造方法
考虑使用静态工厂方法替代构造方法接口 类 数组是引用类型 类实例和数组是对象原创 2020-10-16 10:13:50 · 78 阅读 · 0 评论