![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Effective Java
文章平均质量分 71
zhangxiaoxiao9527
爱好代码的精神小伙儿
展开
-
Effective Java 【类和接口】第18条 复合优先于继承
目录前言如何解决问题什么是复合总结前言在包的内部使用继承是非常安全的,在那里子类和超类的实现都处在同一个程序员的控制之下。对于专门为了继承而设计并且具有很好的文档说明的类来说(详见第19条),使用继承也是非常安全的。然而,对普通的具体类进行跨越包边界的继承,则是非常危险的。其原因主要是因为:与方法调用不同的是,继承打破了封装性。子类依赖于其超类中特定功能的实现细节。如果超类中的实现改变,就有可能给子类的逻辑带来很大的危害。因而,子类必须要跟着其超类的更新而演变,除非超类是专门为了扩展而设计的,并且原创 2021-04-28 23:44:51 · 113 阅读 · 0 评论 -
Effective Java 【类和接口】第17条 使可变性最小化
目录前言不可变类的五条规则java中如何控制对于顶层的(非嵌套的)类和接口对于成员(域、方法、嵌套类和嵌套接口)如何确定成员应该用什么修饰符?总结前言不可变类是指其实例不能被修改的类。 每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象整个生命周期不变。JDK中有很多例子,String、基本类型的包装类、BigInteger和BigDecimal。不可变的类比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全。不可变类的五条规则不要提供任何会修改对象状态的方法(也称设值方法原创 2021-04-28 00:28:54 · 133 阅读 · 0 评论 -
Effective Java 【类和接口】第16条 在公共类而非公有域使用访问方法
目录本周总结为一句话,对于共有类(public类),不应该暴露可变数据域,应该提供访问方法。这样无法对数据加以约束,如果使(final)不可变数据域则危害性稍微小一点。常见的做法就是我们通常给变量设置getter和setter方法。class Point { private double x; private double y; public final String z; public Point(double x, double y,String z) {原创 2021-04-27 22:38:38 · 83 阅读 · 0 评论 -
Effective Java 【类和接口】第15条 使类的成员的可访问行最小化
目录前言java中如何控制对于顶层的(非嵌套的)类和接口对于成员(域、方法、嵌套类和嵌套接口)如何确定成员应该用什么修饰符?总结前言区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其内部数据和其他实现细节。设计良好的组件会隐藏所有的实现细节,把API与实现清晰地隔离开来。这种概念被称为信息隐藏或者封装,是软件设计地基本原则之一。信息隐藏之所以非常重要有许多原因,其中大多是因为:**它可以有效地解除组成系统地各组件之间地耦合关系,即解耦,使得这些组件可以独立地开发、测试原创 2021-04-19 21:47:41 · 159 阅读 · 2 评论 -
Effective Java 【对于所有对象都通用的方法】第14条 考虑实现Comparable接口
目录Comparable接口接口规约如何重写?总结Comparable接口与本章中讨论的其他方法不同,compareTo方法没有在Object类中声明。相反,它是Comparable接口中唯一的方法。compareTo方法不但允许进行简单的等同比较,而且允许执行顺序比较,除此之外,它与Object的equals方法具有相似的特征,它还是个泛型(generic)。类实现Comparable接口的对象数组进行排序就这么简单。Arrays.sort(a);**一旦类实现了Comparable接口,它就可原创 2021-04-10 14:01:30 · 128 阅读 · 0 评论 -
Effective Java 【对于所有对象都通用的方法】第13条 谨慎地覆盖clone
目录谨慎地覆盖cloneCloneable接口并没有包含任何方法,那么它到底有什么作用呢?Object类中的clone()方法如何重写好一个clone()方法1.对于数组类型我可以采用clone()方法的递归2.如果对象是非数组,建议提供拷贝构造器(copy constructor)或者拷贝工厂(copy factory)3.如果为线程安全的类重写clone()方法4.如果为需要被继承的类重写clone()方法总结谨慎地覆盖cloneCloneable接口地目的是作为对象的一个mixin接口(详见第20原创 2021-04-08 23:01:04 · 161 阅读 · 1 评论 -
Effective Java 【对于所有对象都通用的方法】第12条 始终要覆盖toString
始终要覆盖toString虽然 Object提供了 tostring方法的一个实现,但它返回的字符串通常并不是类的用户所期望看到的。它包含类的名称,以及一个“@”符号,接着是散列码的无符号十六进制表示法,例如 PhoneNumber163b91。tostring的通用约定指出,被返回的字符串应该是一个“简洁的但信息丰富,并且易于阅读的表达形式”;“建议所有的子类都覆盖这个方法。原因如下:1.提供好的toString实现可以使类用起来更加舒适 ,使用了这个类的系统更易于调试。2. 在实际应用中,to原创 2021-04-08 21:11:49 · 101 阅读 · 0 评论 -
Effective Java 【对于所有对象都通用的方法】第11条 覆盖equals时总要覆盖hashCode
覆盖equals时总要覆盖hashCode在每个覆盖率equals方法的类中,都必须覆盖hashCode方法。如果不这样做,就违反了hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运行,这类集合包括HashMap和HashSet(所有用到哈希表的地方),下面是约定内容,摘自Object规范:在应用程序的执行期间,只要对象的equals方法比较操作所有的信息没有被修改,那么对同一个对象的多次调用,hashCode方法都必须返回同一值。在一个应用程序与另一个应用程序的执行过程中,翻译 2021-04-07 23:58:31 · 206 阅读 · 0 评论 -
Effective Java 【对于所有对象都通用的方法】第10条 覆盖equals方法请遵守通用规范
覆盖equals方法请遵守通用规范尽管Object是一个具体类,但是设计它主要是为了扩展,它所有的非final方法(equals、hashCode、toString、clone、finalize)都有明确的通用约定,因为它们设计成是可覆盖的(override),任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用约定,如果不能做到这点,其他依赖于这些约定的类(例如:HashMap和HashSet)就无法结合该类一起正常运作。覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果翻译 2021-04-06 22:35:33 · 136 阅读 · 0 评论 -
Effective Java【创建和销毁对象篇】 第9条 try-with-resources优先于try-finally
try-with-resources优先于try-finallytry-with-resources是jdk1.7引入的语法糖,使得关闭资源操作无需层层嵌套在finally。Jav类库中包括许多调用close方法来手工关闭资源。例如:InputStream、OutputStream和java.sql.Connection。客户端经常会忽略资源的关闭,造成严重的性能后果,虽然这其中的许多资源都是用终结方法作为安全网,但是效果并不是很理想。根据经验:try-finally语句是确保资源会被适时关闭的最转载 2021-03-31 22:44:55 · 138 阅读 · 0 评论 -
Effective Java 【创建和销毁对象篇】第7条 消除过期的对象引用
避免创建不必要的对象Java具有垃圾回收机制,当用完对象以后,会被自己回收,但是并不代表就不需要考虑内存管理的事情。请看下面的例子:public class Stack { public int size = 0; private Object[] elements; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Objec转载 2021-03-31 21:24:03 · 133 阅读 · 0 评论 -
Effective Java 【创建和销毁对象篇】第6条 避免创建不必要的对象
避免创建不必要的对象一般来说,如果对象是不可变的,最好重用一个对象,而不是每次需要的时候,就去重新一个相同功能的对象,重用可以提高性能。作为一个反面例子,看看下面的语句:String s = new String("java");//类似于包装类,基础数据装箱每次执行以上代码的时候,都会重新创建一个新的String实例,但是创建的实例功能和意义完全是不必要的,String构造器的参数(“java”)本身就是一个String实例,功能方面等同于构造器所创建的对象,如果以上代码是在一个循环体内,或者在转载 2021-03-30 23:01:13 · 119 阅读 · 0 评论 -
Effective Java 【创建和销毁对象篇】 第5条 优先考虑依赖注入来引入资源
优先考虑依赖注入来引入资源有许多类会依赖一个或者多个底层的资源,例如:拼写检查器需要依赖词典。因此,像下面这种把类实现为静态工具类的做法很常见。public class SpellChecker{ private static final Lexicon dictionary = ...; private SpellChecker(){ } public static boolean isValid(String word){ } public static L原创 2021-03-29 21:48:33 · 146 阅读 · 2 评论 -
Effective Java 【创建和销毁对象篇】第4条 通过私有构造器强化不可实例化的能力
通过私有构造器强化不可实例化的能力有时候可能需要编写只包含静态方法和静态域的类,类似java.lang.Math和 java.util.Arrays的方式,把基本类型的值,或者数组类型上的相关方法组织起来,类似java.util.Collections的方式,把实现特定接口的对象上的方法,包括工厂方法,组织起来。这样的工具类不希望被实例化,因为没有任何意义,但是在缺少显式构造器的情况下,编译器会自动提供一个公有的,无参的隐式构造器。企图将类定义为抽象类来强制该类不可被实例化也是行不通的,该类还是可以被转载 2021-03-29 21:21:58 · 89 阅读 · 0 评论 -
Effective Java 【创建和销毁对象篇】第3条 用私有构造或者枚举类强化Singleton属性
用私有构造或者枚举类强化Singleton属性Singleton(单例)是指仅仅被实例化一次的类,Singleton通常表示一个无状态的对象,或者本质上唯一的系统组件。实现Singleton有两种常用的方式,这两种方式都要保证构造器的私有化,并导出共有的静态成员变量,以便客户端能够获取类唯一的实例,第一种方法,饿汉模式:public class SingletonDemo{ public static final SingletonDemo SINGLETON_DEMO = new Singl原创 2021-03-22 23:17:24 · 105 阅读 · 0 评论 -
Effective Java 【创建和销毁对象篇】第2条 遇到多个构造器参数时要考虑使用构建器
1.遇到多个构造器参数时要考虑使用构建器在Java中,对类而言,实例化一个对象的传统方式是提供公用的构造方法,还有一种方法就是,通过静态工厂的方式来获取一个对象的的实例。本文将详细介绍其中原因。通常我们获取对象的常用方法是通过类的构造器new出来,但是我们在写代码的过程中应当避免这种方式,采取静态工厂方法的方式获取对象。(不是一定指设计模式中的 [ 静态工厂方法 ](https://blog.csdn.net/qq_38941937/article/details/112797985))好处静原创 2021-03-22 22:03:57 · 88 阅读 · 0 评论 -
Effective Java 【创建和销毁对象篇】第1条 用静态方法代替构造器
1.用静态方法代替构造器在Java中,对类而言,实例化一个对象的传统方式是提供公用的构造方法,还有一种方法就是,通过静态工厂的方式来获取一个对象的的实例。本文将详细介绍其中原因。通常我们获取对象的常用方法是通过类的构造器new出来,但是我们在写代码的过程中应当避免这种方式,采取静态工厂方法的方式获取对象。(不是一定指设计模式中的[静态工厂方法](https://blog.csdn.net/qq_38941937/article/details/112797985))好处静态工厂相比于构造方法,它原创 2021-03-16 23:00:41 · 157 阅读 · 1 评论