Effective java读书笔记

《Effective Java 中文版》读书笔记 本书分为12章共90个条目,涵盖了Java 5.0/6.0/ 7.0/ 8.0/9.0的种种技术要点。与第2版相比,本书删除了“C语言结构的替代”一章,增加了Java 7及之后所引入的新特性: Lambda表达式、Stream、 Optional 类、接口中的默认方法、try-with-resources、@SafeVarargs注解、Module 模块化。数量上从78个条目发展到了90个,不仅增加了12个条目,并对原来的所有资料都进行了全面的修改,删去了一些已经过时的条目。但是,各章之间并没有严格的前后顺 阅读详情

第一章节

1)利用静态工厂方法代替构造器

//com.insanus.OldNews.java
package com.insanus;
public class OldNews {
    //private static OldNews object = null;
    private OldNews() {
    }
    public static OldNews createOldNews() {
        //if (object != null)
        //    return object;
        return new OldNews();
    }
    //public static <T, V> HashMap<T, V> createOldNews() {
    //}
}

注释部分使代码更像singleton

四大优点:

  1. 静态工厂方法具有名字,使用起来更加清楚
  2. 可以不用每次调用时都创建新的对象
  3. 可以返回任何子对象的实例
  4. 在构造参数化类型实例可以使代码变得简洁

缺点:

  1. 如果不存在不受保护的构造器,会导致无法构造子对象实例
  2. 静态工厂方法和其他静态方法没什么区别

2)构建器1

//com.insanus.People.java
package com.insanus;
public class People {
    private int year;
    private String name;
    private float weight;
    private float height;
    //构建器
    public static class Builder {
        private int year;
        private String name;
        private float weight = 0;
        private float height = 0;
        public Builder(int year, String name) {
            this.year = year;
            this.name = name;
        }
        public Builder setWeight(float weight) {
            this.weight = weight;
            return this;
        }
        public Builder setHeight(float height) {
            this.height = height;
            return this;
        }
        public People createPeople() {
            return new People(this);
        }
    }
    private People(Builder builder) {
        year = builder.year;
        name = builder.name;
        weight = builder.weight;
        height = builder.height;
    }
}

这样就能使代码变得非常简洁,可扩展性也大大提升

People people = new People.Builder(18, "insanus").setHeight(180).createPeople();

相比于JavaBean和重叠构造器。构建器拥有更多优点

3)私有构造器或枚举强化singleton属性

第一种写法

//com.insanus.Singleton1.java
public class Singleton1 {
    public static final Singleton1 INSTANCE = new Singleton1();
    private Singleton1() {
    }
    public void method() {
    }
}

第二种写法

//com.insanus.Singleton2.java
public class Singleton2 {
    private static final Singleton2 INSTANCE = new Singleton2();
    private Singleton2() {
    }
    //静态工厂方法
    public static Singleton2 getSingleton() {
        return INSTANCE;
    }
    public void method() {
    }
}

第三种写法

//com.insanus.Singleton3.java
public enum Singleton2 {
    INSTANCE;
    public void method() {
    }
}

扩展:enum2

4)通过私有构造器强化不可实例化

我们甚至可以在私有构造器中抛出异常

//com.insanus.UtilityClass.java
package com.insanus;
public class UtilityClass {
    private UtilityClass() {
        throw new AssertionError();
    }
}

5)避免创建不必要的对象

不要这样写String s = new String("Text");

这样写会使编译器创建更多的String实例,正确的写法是
String s = "Text";

重用已知不会被修改的可变对象

//effective java例子
import java.util.Date;
import java.util.TimeZone;
import java.util.Calendar;
class Person {
    private final Date birthDate;
    //这里还没设置birthDate数据
    private static final Date BOOM_START;
    private static final Date BOOM_END;
    static {
        Calendar gmtCal =
                Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_START = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_END = gmtCal.getTime();
    }
    public boolean isBabyBoomer() {
        return birthDate.compareTo(BOOM_START) >=0 &&
                birthDate.compareTo(BOOM_END) <=0;
    }
}

利用静态域,使代码不必重复创建对象,极大提高性能

使用基本类型而不是装箱基本类型

观察Long i和long i的区别
两者性能千差万别,所以要优先使用基本类型而不是装箱基本类型

6)消除过期的对象引用

众所周知,java是一种具有垃圾回收回收的语言。然而,我们依旧得关注内存管理的问题。

//com.insanus.List.java
package com.insanus;
public class List {
    private Object[] elements;
    private int size = 0;
    private static final int MAX = 1000;
    public List() {
        elements = new Object[MAX];
    }
    //...
    public Object pop() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        return elements[--size];
        //我们关注在这里
    }
}

但你确定不再引用这些对象的时候,编译器却不知道,它依旧勤勤恳恳的维护这些过期的对象。所以,我们应该消除这些过期的对象引用。

//升级版的pop
public Object pop() {
    if (size == 0) {
            throw new EmptyStackException();
        }
    Object i = elements[--size];
    elements[size] = null;
    //我们从这里消除了过期的对象引用
    return Object;
}

7)避免使用finalize()

首先提几个缺陷:

  1. 你不能保证finalize一定被执行,当然,这不是你的原因。
  2. finalize的优先级太低,大概可以比喻成,饭都盛进去了,而碗还没有洗
  3. 使用finalize会导致严重的性能缺失

但我们确实需要一个终止功能时,该如何编写终止方法。

显式的终结

//com.insanus.Died.java
package com.insanus;
public class Died {
    private boolean isDie;
    //我们在私有域中写了这么一句话,当我要引用这个对象的方法是,想检查一下是不是被终结了
    public void cancel() {
        isDie = true;
    }
}

当我确定要使用finalize时,请确保super.finalize(),因为终结方法链不会自动执行。

招财牛猫|股社区|猫笔刀公众号历史文章13-21年(含评论),投资内容 收藏学习 招财大牛猫|股社区|猫笔刀公主号历史文章13-21年(含评论) 阅读详情

相关推荐

从RADIUS服务器到AP:实战搭建一个小型WPA2-Enterprise测试环境(FreeRADIUS + 家用路由器)

本文详细介绍了如何从零搭建WPA2-Enterprise测试环境,使用FreeRADIUS服务器和家用路由器实现企业级WiFi认证。通过实战指南,包括证书生成、EAP-PEAP配置、OpenWrt路由器设置及故障排查,帮助网络工程师和爱好者掌握802.1X协议栈的实际应用。

weixin_28715953的博客 325

Effective Java 读书笔记

Effective Java 读书笔记

SteveJrong's Blog 1165

手把手教你用Python实现双三次插值(附OpenCV对比测试)

本文深入解析了双三次插值算法的数学原理,并提供了从零开始的Python实现教程。通过与OpenCV官方实现的对比测试,详细评估了不同插值算法(包括最邻近差值、双线性插值)在图像质量与计算性能上的差异,帮助开发者掌握高质量图像缩放的核心技术。

weixin_29310605的博客 297

Effective Java读书笔记

Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. Background 看了历史, 写第一篇笔记居然是2016年的事情了, 中间半途而废搁置了好长时间, 去年生病的时候捡起来看了一些, 今年终于看完了. 做这个笔记的目的主要是为了个人学习, 把一本书...

weixin_34195546的博客 144

树莓派安装snowboy

1、树莓派换源 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113615915 2、更新pip3 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113616214 3、存取麦克风 我们使用PortAudio作为音频输入/输出的跨平台支持。我们还使用sox作为快速实用程序来检查麦克风设置是否正确。 sudo apt-get install python-pyaudio python

qq_43556844的博客 1923

STM32实战篇:使用USART发送/接收数据

在发送字符时也可以直接使用其对应的ASCLL码,例如: USART_SendData(USART1, 0x61);

qq_74114817的博客 596

Effective Java读书笔记完结啦

Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. Background 看了历史, 写第一篇笔记居然是2016年的事情了, 中间半途而废搁置了好长时间, 去年生病的时候捡起来看了一些, 今年终于看完了. 做这个笔记的目的主要是为了个人学习, 把一本...

weixin_30432579的博客 163

arduino esp8266_Arduino传感器教程 第22章ESP8266 控制 5V 继电器

ESP8266控制5V继电器目录一、NodeMCU二、工作原理本文将使用亚马逊 AlexaEcho 和 ESP8266 控制 5V 继电器。NodeMCUNodeMCU 是一个开源的 IoT 物联网硬件开发板,由于它支持 WIFI 功能且使用方法十分类似 Arduino 开发板,所以近些年获得了越来越多来自全世界的创客朋友们的青睐。NodeMCU 尺寸与 Arduino Nano 类似。...

weixin_39611722的博客 3458

《Effective Java》读书笔记

优先使用接口、泛型、静态工具类...

qq_43336396的博客 750

CKA-CN考试之路----16

所以结合本题,如果有多个文件中都存在同一个值,务必统一,或者修改最后一个次序的文件。中以不同的文件名来区分不同目的的配置会更有利于阅读.就像本题中的。但当有多个文件中存在同一个参数的不同值,最后会生效哪个值?中,但随着配置越来越多不怎么容易阅读.当多个文件同时存在一个参数,但值又不同。有时候我们会将所有内存参数全部写在。确认服务状态(2个红框中的内容)

Q先生 302

基于泰勒展开改进的物理信息神经网络

基于泰勒展开改进的物理信息神经网络

天天酷科研的博客 505

《Effective Java》读书笔记(已更新至24条)

《Effective Java》读书笔记目录,这篇文章记录了我读这本书的一些想法和验证,带水印刘屠户的java养猪场是我的公众号,考虑后面的源码解析同步到公众号中。 1. 考虑用静态工厂方法代替构造器 第一条,考虑用静态工厂方法代替构造器 优点一:静态工厂可以很好的理解名称 四个构造方法,面对这样的构造方法,三个、四个是可以接受的,那如果是七个八个甚至是十几个呢?这个时候有一个好的...

Joseph_Geeker的博客 1470

【MATLAB】嵌入式ADC/DAC控制工程

摘要:本文针对嵌入式ADC/DAC应用中存在的量化误差、采样噪声、输出漂移等问题,提出基于MATLAB的仿真优化方案。通过构建完整的ADC/DAC仿真模型,实现了采样建模、数字滤波、误差校准和闭环控制仿真。方案采用滑动平均滤波抑制ADC噪声,双校准参数补偿DAC固有误差,并将算法轻量化移植至STM32平台。实测表明,该方案使ADC采样波动从±25mV降至±5mV,DAC输出偏差从42mV降至18mV,显著提升了模拟量交互精度和系统稳定性。整套方案资源占用低,适配各类嵌入式高精度控制场景,具有较高的工程应用价

unber的博客 650

Effective Java读书笔记(1)—— 创建和销毁对象

很久以前买的一本《Effective Java》,最近开始读啦!从第二章开始看(第一章是引言),每一章都有若干条建议,翻了一下感觉对日常编码有很强的指导意义呀,勤劳的我决定写个读书笔记记录一下????。 第一条:考虑用静态工厂方法代替构造器 说到静态工厂方法,书里给的例子是包装类型,也就是平时常会用到的Integer.valueOf(),Integer.parseInt()想必也算,返回的都是Int...

Aviato 280

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《Effective Java》读书笔记,移动安全入门

equals()方法实现了等价关系。 自反性。对于任何非null的引用值x,x.equals(x)必须返回true.(对象必须等于其自身) 对称性。对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。(警惕子类父类不同的equals实现时) 传递性。对于任何非null的引用只x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equeals(z)也必须返回true。(优先使用组合

m0_66264938的博客 225

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【effective java读书笔记】通用程序设计(二)

前言 以前曾经做ERP时,总是遇到尾差尾数的问题。比如:库存一箱苹果10元钱,假如一共3个苹果。拿走两个还剩多少钱。好了,言归正传,回到今天的读书笔记,精度问题。 第47条了解和使用类库 第48条如果需要精确的答案避免使用double和float 第49条基本类型优先于装箱基本类型

haibo_bear的博客 369

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Effective Java读书笔记一

Effective Java 读书笔记~~~ package com.lcj;public class Main {/** * #考虑使用静态工厂方法来替换构造器 * 优点 * 1,每个对象都有名字。 * 2,不必每次都 new 出一个对象。 * 3,多态的方式存在,返回的都是对象的子类。 * 缺点 * 1,类如果存在公有或则保护的构造器,就不能被子类化了(对象注册器中的构造器私有需

陨落烟雨的博客 474

【读书笔记】《Effective Java》第二章 第1条:创建和销毁对象

一、前言 《Effective Java》读书笔记系列 二、介绍 通常情况下客户端想要获取一个类A的实例,最传统的方式就是让A提供一个public的构造函数。实际上除此之外还有一种方式,那就是提供一个public的静态工厂方法 三、举例 以Integer为例子,Integer里面除了提供构造函数外,还提供了对应的静态工厂方法: public final class Integer extends Number implements Comparable<Integer> { //构造函数1

qq_38872414的博客 283

Effective Java读书笔记(2)—— 所有对象通用的方法

这一章写的是对所有对象都通用的一些方法,换言之就是Object带有的一些方法(Object类是所有类的父类),在这些方法中非final的类都是被设计为需要重写的,重写时需要遵从一些通用的约定。 第一条:使用try-with-resources语句代替try-finally语句 在进行IO操作和JDBC数据库操作的时候,最终都要手动调用close()关闭资源(用finalizer机制也可以,但是...

Aviato 301

《Effective Java》读书笔记三

一、明确接口的核心作用定义类型:接口的主要目的是为了定义一种特定的行为规范和类型标识。它描述了一组方法签名,任何实现该接口的类都必须提供这些方法的具体实现。通过接口,我们可以以一种统一的方式来处理不同的实现类,而无需关心具体的实现细节。类型标识的重要性:接口作为一种类型,可以在代码中用于变量声明、方法参数和返回值类型等。这使得代码更加灵活和可扩展,因为可以在运行时根据实际情况传入不同的实现类,而无需修改调用代码。二、避免不恰当的使用不要在接口中定义常量以外的变量:接口不应该被用作存储数据的地方。

qq_41831136的博客 803

effective java 读书笔记

前言 仅记录学习笔记,如有错误欢迎指正。 Java支持4种类型:接口、类、(包括Enum)、数组和基本类型,前面3者都是引用类型,类实例和数组是对象(所以数组是存放在jvm的堆区!),而基本类型的值则不是对象。 区别:基本数据类型指的是值的拷贝,而对象类型指的是值的引用。所以二者的存放区域也不一样。 书中提出以静态工厂方法代替构造器,并列举以下几点优势: 静态工厂方法可以有自己的名称(可以避免多个构造器用户不知道调用哪个的问题)[x]它是单例的,提升性能[x]静态工厂方法可以返回原返回类型的任何子类型对

njh1147394013的博客 328
下一篇: 内部类的理解
insanuscsdn
博客等级 码龄11年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值