首页 > 编程语言 >《Effective Java》阅读笔记-第四章

《Effective Java》阅读笔记-第四章

时间:2023-11-29 16:33:22浏览次数:41  
标签:Java 内部 Effective 静态 接口 嵌套 class 第四章

Effective Java 阅读笔记

第四章 类和接口

第 15 条 使类和成员的可访问性最小化

软件设计的基本原则之一:封装

第 16 条 使用 Getter/Setter 代替 public 字段

这书的翻译可真垃圾

第 17 条 使可变性最小化

标准库中有许多不可变类:String、基础类型的封装类、BigInteger、BigDecimal等,不可变类更容易设计、实现、使用,不容易出错并且更加安全。

设计不可变类时应遵循下面几条规则

  • 不提供可修改对象状态的方法
  • 保证类不会被扩展
  • 声明字段为 final
  • 声明字段为私有
  • 确保可变组件的访问为互斥(即防止外部获取到内部可变对象的引用)

第 18 条 组合优先于继承

简而言之,继承打破了封装性,并且只能单继承,一些新的语言甚至直接舍弃了继承(例如 Golang)。

可以使用组合&转发来代替继承。

第 19 条 要么设计继承并提供说明文档,要么禁止继承

个人感觉因噎废食了,见仁见智吧。

第 20 条 接口优于抽象类

因为只能单继承,但是可以实现多个接口,明显接口的灵活性是要大于抽象类的。
并且接口中已经可以提供默认实现,比抽象类更加方便。

  • 现有类可以很容易被更新,以实现新接口
  • 接口是定义 mixin(混合类型)的理想选择
  • 接口允许构造非层次接口的类型

第 21 条 为后代设计接口

Java 8 之前,接口不能添加默认实现,如果给一个接口添加了一个方法,那么所有实现这个接口的类都要去实现这个新方法。
Java 8 中,接口添加了默认实现,可以给现有接口添加新方法,但是这也是有一定风险的。

第 22 条 接口只用于定义类型

不要使用接口去定义常量,否则在添加了新的常量之后,实现了该接口的方法会出现不可预测的错误。

第 23 条 类层次优先于标签类

也就是使用类结构去实现,而不是使用注释去标记某个字段是什么类型下用的。

第 24 条 静态嵌套类优先于非静态嵌套类

嵌套类,是定义在类里面的类。

嵌套类分为以下四种:

  1. 静态嵌套类(Static Nested Class)

静态嵌套类是声明为静态的内部类。它与外部类关联,但没有隐含对外部类实例的引用。可以通过外部类的名称直接访问静态嵌套类。

public class OuterClass {
    static class StaticNestedClass {
        // 静态嵌套类的成员
    }
}
  1. 非静态嵌套类(Nonstatic Nested Class)又称成员内部类(Member Inner Class)

与静态嵌套类不同的是它不使用 static 修饰,它有一个隐含的对外部类实例的引用,可以访问外部类的成员。

public class OuterClass {
    class InnerClass {
        // 非静态嵌套类的成员
    }
}
  1. 局部类(Local Inner Class),同样也是内部类

声明在方法内部的内部类。局部内部类只能在声明它的方法中使用。

public class OuterClass {
    void someMethod() {
        class LocalInnerClass {
            // 局部内部类的成员
        }
    }
}
  1. 匿名内部类(Anonymous Inner Class),也是内部类

匿名内部类是一种没有命名的局部内部类,通常用于实现接口或继承一个类的匿名对象。

public class OuterClass {
    // 只是这种写法,定义在哪里都可以
    InterfaceName obj = new InterfaceName() {
        // 匿名内部类的成员
    };
}

如果内部类不需要引用外部实例,那么就把它声明为静态嵌套类。

第 25 条 限制源文件为单个顶级类

Java 允许在单个源文件中定义多个顶级类(或接口),但是这么做并没有什么好处,只会带来巨大风险。

标签:Java,内部,Effective,静态,接口,嵌套,class,第四章
From: https://www.cnblogs.com/aliveneko/p/17865212.html

相关文章

  • Java学习之路(七)
    Java学习之路(七)1.ArrayList集合集合和数组的区别:​ 共同点:都是存储数据的容器​ 不同点:数组的容量是固定的,集合的容量是可变的1.1ArrayList的构造方法和添加方法publicArrayList()创建一个空的集合对象publicbooleanadd(Ee)将指定的元素追加到此集合的末尾......
  • java基础:while循环,珠穆拉玛峰案例
    1.whille循环格式:packagecom.itheima.loop;publicclassWhile1{publicstaticvoidmain(String[]args){inti=0;//初始化语句while(i<5){//循环条件System.out.println("");//循环体语句i++;//迭代语句,迭代语句不......
  • 通过Java-Netty实现一个简单的HTML实时聊天——demo
    demo效果初步准备想要实现聊天就需要用到WebSocket,他是专门用于http进行实时聊天的的协议。因为主要核心在后端开发,所以我去白嫖了个超级简单的界面(就是不会!)我编写demo时系统环境为Win-11,Java-8环境依赖只需要一个netty即可实现需要的功能<!--netty--><dependency><g......
  • 使用javascript求最小生成树
    在JavaScript中,求取最小生成树(Minimum Spanning Tree, MST)最常用的算法是Prim算法和Kruskal算法。这里我将提供一个基于Kruskal算法的JavaScript实现。首先,定义一个用于存储图的数据结构,这里使用JavaScript的类来实现:class Graph {      constructor(vertices) {   ......
  • Spring Boot 2 正式停止维护。。再见了,Java 8!!
    大家好,我是栈长。没错,就在昨天,SpringBoot2.x停止维护了。。SpringBoot最后一个2.x的版本2.7.x已经停止维护,3.0.x也停止维护了,商业支持的版本也只有2.6.x了,2.5.x以下的版本彻底退出历史舞台。。从路线图可以看到每个版本的终止时间,包括最新的SpringBoot3.2.0,也......
  • 阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
    常用文件夹分层pojovo:与前端交互的所有对象,包括接参和返回query:查询的筛选条件,前端传参和后端内部传参通用dto:后端内部传参专用分层缘由分层领域模型规约:DO:数据对象,与数据库看表结构对应。DTO:数据传输对象,业务层向外传输对象BO:业务对象,由业务层输出的业务逻......
  • jmeter发送java请求
    本文描述jmeter如何发送java请求1.编写java请求,将加密、签名等封装,对外只暴露需要传的业务参数,jemter发送java请求时直接传入业务参数即可添加依赖:12345<dependency>    <groupId>org.apache.jmeter</groupId>    <artifactId>ApacheJMeter_java</art......
  • JAVA生产解析DXF;DXF-LIB
    DXF-LIBDXF解析参考资料:DXF格式-中文参考手册项目地址GitHUB地址GitEE地址DXF文件解析组件这是一个可以解析dxf文件的jar包,目前支持解析的图形有点、圆、直线、ARC弧线、多线段、单行文本、多行文本、图元将其解析为几何数据和点线数据,存储在DxfResolverImpl的baseStru......
  • 使用 Charles 抓取 Java 应用内 HTTP/HTTPS 请求
    代码设置OkHttpClientclient=newOkHttpClient();System.setProperty("http.proxyHost","127.0.0.1");System.setProperty("https.proxyHost","127.0.0.1");System.setProperty("http.proxyPort"......
  • JavaScript高级程序设计的代理与捕获——工作中的实际意义。
    js红宝书写得很好,很多东西都给你一一解释了,但是有一点我很想吐槽:没有在写代码例子之前说明,相关东西有啥用,在实际工作中有啥现实意义等等,导致很多人理解了概念和看懂了枯燥的代码段后却无法有效运用到自己的工作当中。因为你不知道拿来用到什么地方或者说什么情况下才去用它!举个我......