随笔分类 -  Effective Java

摘要:与方法调用不同,继承打破了封装 换句话说,一个子类依赖于其父类的实现细节来保证其正确的功能。 父类的实现可能会从发布版本不断变化,如果是这样,子类可能会被破坏,即使它的代码没有任何改变。 因此,一个子类必须与其超类一起更新而变化,除非父类的作者为了继承的目的而专门设计它,并对应有文档的说明 只有在子 阅读全文
posted @ 2020-04-10 04:04 webzom 阅读(239) 评论(0) 推荐(0)
摘要:不可变类简单来说是其实例不能被修改的类。 包含在每个实例中的所有信息在对象的生命周期中是固定的,因此不会观察到任何变化。 Java 平台类库包含许多不可变的类,包括 String 类、基本类型包装类以及 BigInteger 类和 BigDecimal 类。 有很多很好的理由:不可变类比可变类更易于 阅读全文
posted @ 2020-04-06 18:25 webzom 阅读(120) 评论(0) 推荐(0)
摘要:有时候,你可能会试图写一些退化的类(degenerate classes),除了集中实例属性之外别无用处 class Point { public double x; public double y; } 由于这些类的数据属性可以直接被访问,因此这些类不提供封装的好处(详见第 15 条)。 如果不更 阅读全文
posted @ 2020-04-06 18:24 webzom 阅读(192) 评论(0) 推荐(0)
摘要:将设计良好的组件与设计不佳的组件区分开来的最重要的因素是,隐藏内部数据和其他实现细节的程度。一个设计良好的组件隐藏了它的所有实现细节,干净地将它的 API 与它的实现分离开来。然后,组件只通过它们的 API 进行通信,并且对彼此的内部工作一无所知。这一概念,被称为信息隐藏或封装,是软件设计的基本原则 阅读全文
posted @ 2020-04-06 18:15 webzom 阅读(144) 评论(0) 推荐(0)
摘要:compareTo 方法并没有在 Object 类中声明。 相反,它是 Comparable 接口中的唯一方法。 它与 Object 类的 equals 方法在性质上是相似的,除了它允许在简 单的相等比较之外的顺序比较,它是泛型的。 通过实现 Comparable 接口,一个类表明它的实例有一 个自 阅读全文
posted @ 2020-04-03 00:57 webzom 阅读(191) 评论(0) 推荐(0)
摘要:Cloneable 接口的目的是作为一个 mixin 接口 (详见第 20 条),公布这样的类允许克隆。不幸的 是,它没有达到这个目的。它的主要缺点是缺少 clone 方法,而 Object 的 clone 方法是受保护的。你不 能,不借助反射 (详见第 65 条),仅仅因为它实现了 Cloneab 阅读全文
posted @ 2020-04-01 03:49 webzom 阅读(903) 评论(0) 推荐(0)
摘要:虽然 Object 类提供了 toString 方法的实现,但它返回的字符串通常不是你的类的用户想要看到的。它由类名后跟一个「at」符号(@)和哈希码的无符号十六进制表示组成,例如PhoneNumber@163b91 。 toString 的通用约定要求,返回的字符串应该是「一个简洁但内容丰富的表示 阅读全文
posted @ 2020-03-28 22:21 webzom 阅读(153) 评论(0) 推荐(0)
摘要:在每个类中,在重写 equals 方法的时侯,一定要重写 hashcode 方法。 如果不这样做,你的类违反了 hashCode 的通用约定,这会阻止它在 HashMap 和 HashSet 这样的集合中正常工作。根据 Object 规范,以下时具体约定。1. 如果没有修改 equals 方法中用以 阅读全文
posted @ 2020-03-28 22:12 webzom 阅读(226) 评论(0) 推荐(0)
摘要:重写 equals 方法时遵守通用约定 虽然 Object 是一个具体的类,但它主要是为继承而设计的。它的所有非 final 方法(equals、 hashCode、toString、clone 和 finalize)都有清晰的通用约定( general contracts),因为它们被设计为 被子 阅读全文
posted @ 2020-03-26 06:49 webzom 阅读(235) 评论(0) 推荐(0)
摘要:使用 try-with-resources 语句替代 try-finally 语句 从以往来看,try-finally 语句是保证资源正确关闭的最佳方式,即使是在程序抛出异常或返回的情况 下: x static String firstLineOfFile(String path) throws I 阅读全文
posted @ 2020-03-25 02:56 webzom 阅读(321) 评论(0) 推荐(0)
摘要:Finalizer 机制是不可预知的,往往是危险的,而且通常是不必要的。 它们的使用会导致不稳定的行 为,糟糕的性能和移植性问题。 Finalizer 机制有一些特殊的用途,我们稍后会在这个条目中介绍,但是 通常应该避免它们。 从 Java 9 开始,Finalizer 机制已被弃用,但仍被 Jav 阅读全文
posted @ 2020-03-25 02:43 webzom 阅读(234) 评论(0) 推荐(0)
摘要:消除过期的对象引用 考虑以下简单的栈实现: ​x public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; 阅读全文
posted @ 2020-03-24 05:51 webzom 阅读(154) 评论(0) 推荐(0)
摘要:避免创建不必要的对象 在每次需要时重用一个对象而不是创建一个新的相同功能对象通常是恰当的。重用可以更快更流 行。如果对象是不可变的(详见第 17 条),它总是可以被重用。 作为一个不应该这样做的极端例子,请考虑以下语句: ​x String s = new String("bikini"); 语句每 阅读全文
posted @ 2020-03-24 05:44 webzom 阅读(138) 评论(0) 推荐(0)
摘要:依赖注入优于硬连接资源 许多类依赖于一个或多个底层资源。例如,拼写检查器依赖于字典。将此类类实现为静态工具类并 不少见 (详见第 4 条): xxxxxxxxxx // Inappropriate use of static utility - inflexible & untestable! pu 阅读全文
posted @ 2020-03-19 03:19 webzom 阅读(193) 评论(0) 推荐(0)
摘要:一个客户端若想获得某个类的一个实例,一种传统的方式就是让该类提供一个公有的构造器。但是,每个程序员的工具箱里头也应当还有另一种技术:该类也可以提供一个公有的静态工厂方法,然后通过这个静态方法来返回该类的一个实例。这里举一个Boolean类(基本类型boolean的封装类)的例子。这个方法将一个boo 阅读全文
posted @ 2020-01-06 04:49 webzom 阅读(217) 评论(1) 推荐(0)
摘要:有时候,你可能需要编写值包含静态方法和静态域的类,这些来名声不好,因为有些人会滥用它们从而避免思考如何面向对象来编程,尽管如此,它们也确实有它们特别的用处, 我们可以利用这种类以,java.lang.Math或者java.util.Arrays的方式,把基本类型和素质类型上的相关方法组织起来,我们也 阅读全文
posted @ 2017-10-10 15:22 webzom 阅读(58) 评论(0) 推荐(0)
摘要:Singleton通常被用来表示一个无状态的对象,比如函数(条目24),或者一个独一无二的系统组建。使类成为Singleton会使得它的客户端难以调试,因为无法用模拟实现去替代Singleton,除非这个类实现一个充当其类型的接口 实现Singleton有两种方法,两种方法都要把构造器私有化 有两种 阅读全文
posted @ 2017-09-28 15:59 webzom 阅读(106) 评论(0) 推荐(0)
摘要:静态工厂和构造器有个共同的局限性:他们都不能很好的扩展大量的可选参数, 比如包装食品营养成分标签,含量,卡路里,等等,有可能会超过20个可选域,对于这样的类,应该用那种构造器或静态方法来写呢, 构造器: 程序员一般习惯采用重载构造器来实现,第一个构造器,提供一个必要参数,第二个构造器提供,一个必要参 阅读全文
posted @ 2017-09-21 21:26 webzom 阅读(104) 评论(0) 推荐(0)