Effective Java
文章平均质量分 75
茂多多
耗尽你要争的气,流连你尺躯之地。
展开
-
Effective Java--42 lambda表达式优于匿名类
Java8的新特性之一:lambda表达式在Java8中,添加了函数式接口、lambda表达式和方法引用,以便更容易地创建函数对象。同时Stream API也为处理数据序列提供支持。使用单一抽象方法的接口被用作函数类型。它们的实例被称作函数对象,而创建函数对象最常见的方法就是利用匿名类。匿名类匿名类是不能有名字的类,它们不能被引用,只能在创建时用New语句来声明它们。匿名类的声明是在编译时进行的,实例化在运行时进行,这意味着for循环中的一个new语句会创建相同匿名类的几个实例。匿名类的目的是在某原创 2021-08-11 17:01:07 · 126 阅读 · 0 评论 -
Effective Java--27 消除非检查警告
在编程过程中,可能会出现一些黄色波浪线的警告,这些警告一般都说明我们的代码需要修改优化,它们被称为检查警告。使用泛型编程时,会看到许多编译器警告:未经检查的强制转换警告,未经检查的方法调用警告,未经检查的参数化可变长度类型警告以及未经检查的转换警告。 你使用泛型获得的经验越多,获得的警告越少,但不要期望新编写的代码能够干净地编译。如果你不能消除警告,但你可以证明引发警告的代码是类型安全的,那么(并且只能这样)用 @SuppressWarnings("unchecked") 注解来抑制警告。 如果你在没原创 2021-08-10 17:41:59 · 87 阅读 · 0 评论 -
Effective Java---64通过接口引用对象
通过接口引用对象我们应该立马想到多态,这其实也是多态的一种,它的优点是灵活,但是缺点是这个引用变量不能调用接口中没有定义但在使用的构造器类中实现的方法,即类似多态中的父类对象不能调用子类独有的方法。灵活:这个其实很好理解,灵活的原因在于接口可以有多个实现类,不同的实现类可以对接口中的方法定义有不同的实现,例如List接口下的ArrayList和LinkedList,我们可以按照自己的需要进行更换,如果周围的代码有依赖List引用的对象,那么即使从ArrayList更换为LinkedList也只需要改变原创 2021-08-02 23:42:41 · 187 阅读 · 0 评论 -
Effective Java---28列表优于数组
Effective Java一书中给出了列表优于数组的两个原因:1、数组(Array)是协变的,而列表(List)支持泛型,是可变的。2、数组是具体化的,在运行时会知道并强化它们的元素类型;泛型是通过擦除来实现的,只在编译的时候强化类型信息,在运行时擦除。擦除就是使泛型可以与没有使用泛型的代码随意进行互用。...原创 2021-07-28 19:22:25 · 85 阅读 · 0 评论 -
Effective Java---77不要忽略异常
这条建议确实看上去是显而易见的,但是它却常常被违反,因而值得再次提出来。当 API 的设计者声明一个方法将抛出某个异常的时候,表示他们在提示开发人员一些东西。所以,请不要忽略它!要忽略一个异常非常容易,只需将方法调用通过 try 语句包围起来,并包含一个空的 catch 块:// Empty catch block ignores exception - Highly suspect!try { ...} catch ( SomeException e ) {}空的 catch 块会使原创 2021-07-27 19:59:11 · 55 阅读 · 0 评论 -
Effective Java---18 组合优于继承
继承继承是实现代码重用的有效方式,在继承关系中分为父类和子类两种角色,同包级别中子类在继承父类后可以访问父类的非private成员,拥有父类所有的非private成员;但是如果继承使用不当的时候可能会造成子类变得脆弱。实现继承此处涉及的继承是“实现继承”(一个类扩展另外一个类)而非“接口继承”,如果一个子类始终依靠父类提供的方法实现来保证正确的功能,然而父类的方法实现可能会随版本更新迭代,这种情况下子类就可能被破坏,所以子类必须随父类的更新一起变化,除非父类的设计者一开始就是为了继承,并对应有相关文档原创 2021-07-26 11:41:38 · 82 阅读 · 0 评论 -
Effective Java---17 最小化可变性
不可变类不可变类就是被final关键字修饰的类,这样的类为什么说就是不可变的呢?首先final修饰的类中,成员变量是默认的public static final,即在赋值之后不可改变;final类是不能被继承的。因为我们不能在final类实例创建后修改属性的值,所以final类成为不可变类。要创建一个不可变类,需要遵循以下五条规则:不要提供修改对象状态的方法(也称为 mutators,赋值方法例如setter方法)。确保这个类不能被继承。 防止通过子类修改父类。 父类的非private原创 2021-07-25 22:58:12 · 137 阅读 · 0 评论 -
Effective Java---15 使类和成员的可访问性最小化
前言我自己在平时的编程中其实并未太多思考类和成员的访问性,要么是private,或者就是public直接用起来,大家都知道Java中有四种访问级别,从小到大依次是private(类内可访问)、protected(同包下及子类可访问)、default(同包下类可访问,子类不能)、public(All),那我们为什么需要不同的访问修饰符呢?信息隐藏区分设计良好的组件与设计不佳的组件的最重要的依据是,它们关于隐藏内部数据和其他实现细节的程度。一个设计良好的组件隐藏了它的所有实现细节,干净地将它的 API 与原创 2021-07-25 16:40:17 · 173 阅读 · 0 评论 -
Effective Java---16 在公共类中使用访问方法而不是公共属性
前言Java的特性:抽象、封装、继承、多态;在Java的设计实现中随处可见这些特性;封装在字面意思上来理解就是将多种东西打包在一起,我们看到的是一个整体,对外部屏蔽一些东西,在Java中即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数/方法都是类的成员。// Degenerate classes like this should not b原创 2021-07-23 12:00:08 · 120 阅读 · 0 评论 -
Effective Java---20 接口优于抽象类
前言Java有两种机制允许多个类型的实现来进行扩展:接口和抽象类。抽象类即用abstract关键字修饰的类,它的特点是可以存在抽象方法,也可以存在普通方法;接口是用interface关键字修饰的,在Java 8之前只能有抽象方法,在Java 8中允许使用default关键字修饰的普通方法存在,在结构上和抽象类类似,但是抽象类有构造方法的,虽然不能直接实例化,接口就没有。Java的单继承多实现接口优于抽象类的最主要原因就是Java是单继承的,在一定程度上限制了扩展性,限制了它们作为类型定义的使用,我们不原创 2021-07-23 11:31:56 · 108 阅读 · 0 评论 -
Effective Java---12 始终重写 toString 方法
前言虽然 Object 类提供了 toString 方法的实现,但它返回的字符串通常不是使用类的用户想要看到的。 它由类名后跟一个「at」符号(@)和哈希码的无符号十六进制表示组成,例如 PhoneNumber@163b91,这对使用它的人来说实际意义不大。 toString 的通用约定要求,返回的字符串应该是「一个简洁但内容丰富的表示,对人们来说是很容易阅读的」。虽然可以认为 PhoneNumber@163b91 简洁易读,但相比于直接返回字符串: 707-867-5309,高下立判 。 toStrin原创 2021-07-21 11:20:20 · 125 阅读 · 0 评论 -
Effective Java---09 使用 try-with-resources 语句替代 try-finally 语句
为什么要使用try-finallyJava类库中包含许多必须通过调用close()方法手动关闭的资源,比如“InputStream”、“OutputStream”以及数据库连接Connection,开发者可能会忘记关闭资源,这是肯定会影响性能的。尽管这些资源中有很多使用了finalizer机制作为安全网,但是该机制并不能很好的工作。从以往来看,try-finally 语句是保证资源正确关闭的最佳方式,即使是在程序抛出异常或返回的情况下:// try-finally - No longer the be原创 2021-07-20 16:40:51 · 225 阅读 · 0 评论 -
Effective Java---08 避免使用Finalizer和Cleaner机制
Finalizer机制finalize()是Object类下的方法,所以任何类都可以重写finalize()方法,只要在子类中重写了该方法,那么类实例对象的回收就会变得复杂;如果重写了finalize()方法,在使用new关键字创建对象时,会同时创建一个finalize实例指向该对象的引用,即使程序已经结束了对该对象的使用,但是JVM并不能回收,因为它会发现还存在一个引用,于是把这个类的引用放入一个finalize机制的引用队列java.lang.ref.Finalizer.ReferenceQueue,原创 2021-07-20 16:16:05 · 222 阅读 · 0 评论 -
Effective Java---07 消除过期的对象引用
前言接触过C/C++的程序员都知道,我们是需要手动来进行内存的管理的,资源使用结束需要手动释放内存空间;但是Java不一样,Java带有垃圾回收机制,我们在日常码代码的时候并未过多在意内存的管理,因为我们知道JVM会自动GC,但是我们真的不用管理吗?JVM在什么时候会进行垃圾回收呢?回收的时候涉及哪些资源对象呢?强引用、软引用、弱引用和虚引用强引用是使用最普遍的引用,就是直接引用,通过强引用可以直接访问目标对象。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object strongR原创 2021-07-16 11:56:53 · 168 阅读 · 0 评论 -
Effective Java---06 避免创建不必要的对象
前言在每次需要时重用一个对象而不是创建一个新的相同功能对象通常是首先考虑的的。重用可以更快使用更顺利。如果对象是不可变的,它总是可以被重用。问题引出作为一个不应该这样做的极端例子,请考虑以下语句:String s = new String("bikini"); // DON'T DO THIS!语句每次执s行时都会创建一个新的 String 实例,而这些对象的创建都不是必需的。String 构造方法 ("bikini") 的参数本身就是一个 bikini 实例,它与构造方法创建的所有对象的功能原创 2021-07-15 20:08:32 · 61 阅读 · 0 评论 -
Effective Java---11 重写 equals 方法时同时也要重写 hashcode 方法
前言Java中的所有类都继承了Object类,equals()和hashCode()就来自于Object类;我创建了一个Object类的实例,不去重写hashCode方法,直接输出: Object obj = new Object(); System.out.println(obj.hashCode());默认的hashCode方法的返回值形式:这串数字是什么呢?打来源码查看注释;在hashCode方法注释中,调用hashCode方法默认返回的值被称为哈希码值。看到有文章说原创 2021-07-15 19:53:26 · 173 阅读 · 1 评论 -
Effective Java---05 依赖注入优于硬连接资源
在看到这个Item时,第一反应:什么是依赖注入?什么是硬连接?分别是怎么实现的?为什么前者优于后者?背景许多类依赖于一个或多个底层资源。例如,拼写检查器依赖于字典。将此类类实现为静态工具类并不少见 :// Inappropriate use of static utility - inflexible & untestable!public class SpellChecker { private static final Lexicon dictionary = ...;原创 2021-07-15 00:00:43 · 131 阅读 · 0 评论 -
Effective Java---04 使用私有构造器执行非实例化
Effective Java—04 使用私有构造器执行非实例化背景试想一下,你创建了一个工具类,工具类的所有成员都是静态的以便我们可以全局访问(当然工具类的实现方式也可以通过单例来实现,此处我们不讨论这种方式),我们还有必要提供构造方法吗,或者说构造方法的意义在哪,自然是没有的,还会占用资源!所以我们不希望外部通过调用构造方法创建实例来访问工具类中的成员,大家肯定会想到将构造方法私有化。这就是非实例化:不用实例化的类。(实例化没有任何意义,此时这个类我们希望它是非实例化的)实现public clas原创 2021-07-14 11:20:06 · 87 阅读 · 0 评论 -
Effective Java---03 使用私有构造方法或枚类实现 Singleton 属性
Effictive Java—03 使用私有构造方法或枚类实现 Singleton 属性SingletonSingleton是指仅仅被实例化过一次的类。它通常被用来表示本质上唯一的系统的组件,例如,窗口组件或文件系统。使用场景想控制实例数目,节省系统资源的时候。例如web中的计数器,不用每次刷新都在数据库里加一次,用单例模式实现且缓存起来。实现方式有两种常见的方法来实现单例。两者都基于保持构造方法私有和提供公共静态成员以提供对唯一实例的访问。保持构造方法私有构造方法私有化后外部就无法通过ne原创 2021-07-13 20:05:30 · 104 阅读 · 0 评论 -
Effective Java---02 当构造方法参数过多时使用builder模式
Effective Java---02 当构造方法参数过多时使用builder模式定义使用场景解决问题方式一方式二builder模式如何在客户端使用定义The intent of the Builder design pattern is to separate the construction of a complex object from its representation. By doing so the same construction process can create differ原创 2021-07-13 13:32:15 · 199 阅读 · 0 评论