Effective Java笔记(22)接口只用于定义类型

《Effective Java》第22条:接口只用于定义类型 如果非 final 类(可被继承的类)实现了常量接口,其所有子类都会自动 “继承” 接口中的常量(尽管 Java 中接口常量是隐式public static final,子类并非真正继承,但可直接通过子类名访问)。2、常量属于枚举语义,使用枚举类型:如果常量是一组互斥的枚举项(比如状态、类型、选项等),且具有明确的 “枚举成员” 语义,应使用枚举类型而非普通常量,枚举不仅存储常量值,还能封装行为,是类型安全的常量集合。,类不实现接口,而是直接用接口名.常量名的方式来使用常量(博主常用), 阅读详情

        当类实现接口时,接口就充当可以引用这个类的实例的类型(type)。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作。为了任何其他目的而定义接口是不恰当的。有一种接口被称为常量接口( constant interface),它不满足,上面的条件。这种接口不包含任何方法,它只包含静态的final 域,每个域都导出一个常量。使用这些常量的类实现这个接口,以避免用类名来修饰常量名。下面举个例子:


public interface PhysicalConstants {
    // Avogadro's number (1/mo1)
    static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    // Bo1tzmann constant (J/K)
    static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
    // Mass of the electron (kg)
    static final double ELECTRON_MASS = 9.109_383_56e-31;
}

        常量接口模式是对接口的不良使用。类在内部使用某些常量,这纯粹是实现细节。实.现常量接口会导致把这样的实现细节泄露到该类的导出API中。类实现常量接口对于该类的用户而言并没有什么价值。实际上,这样做反而会使他们更加糊涂。更糟糕的是,它代表了一种承诺:如果在将来的发行版本中,这个类被修改了,它不再需要使用这些常量了,它依然必须实现这个接口,以确保二进制兼容性。如果非final 类实现了常量接口,它的所有子类的命名空间也会被接口中的常量所“污染”。

        在Java平台类库中有几个常量接口,例如java.io.objectStreamConstants。这些接口应该被认为是反面的典型,不值得效仿。

        如果要导出常量,可以有几种合理的选择方案。如果这些常量与某个现有的类或者接口紧密相关,就应该把这些常量添加到这个类或者接口中。例如,在Java平台类库中所有的数值包装类,如Integer和Double,都导出了MIN_VALUE 和MAX_VALUE常量。如果这些常量最好被看作枚举类型的成员,就应该用枚举类型( enum type)来导出这些常量。否则,应该使用不可实例化的工具类(utility class) 来导出这些常量。下面的例子是前面的PhysicalConstants例子的工具类翻版:

public class PhysicalConstants {
    private PhysicalConstants() { } // Prevents instantiation
    public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
    public static final double BOLTZMANN_CONST = 1.380_648_52e-23;
    public static final double ELECTRON_MASS = 9.109_383_56e-31;
}

        注意,有时候会在数字的字面量中使用下划线(_)。从Java 7开始,下划线的使用已经合法了,它对数字字面量的值没有影响,如果使用得当,还可以极大地提升它们的可读性。如果其中包含五个或五个以上连续的数字,无论是浮点还是定点,都要考虑在数字的字面量中添加下划线。对于基数为10的字面量,无论是整数还是浮点,都应该用下划线把数字隔成每三位一组,表示一千的正负倍数。

        工具类通常要求客户端要用类名来修饰这些常量名,例如PhysicalConstants .AVOGADROS_NUMBER。 如果大量利用工具类导出的常量,可以通过利用静态导入(static import)机制,避免用类名来修饰常量名:

// Use of static import to avoid qualifying constants
import static com. effectivejava. science. Physica1Constants.*;

public class Test {
    double atoms (double mols) {
        return AVOGADROS_ NUMBER * mols;
    }
    ... 
    // Many more uses of Physi ca1Constants justify static import 
}

        

简而言之,接口应该只被用来定义类型,它们不应该被用来导出常量。

《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个条目,并对原来的所有资料都进行了全面的修改,删去了一些已经过时的条目。但是,各章之间并没有严格的前后顺 阅读详情

相关推荐

AI Agent生产环境压测指南:并发、延迟与资源瓶颈定位

去年我接触了不下10个AI Agent上线翻车的案例:有做智能客服的公司双11当天流量暴涨3倍,Agent服务直接雪崩,用户咨询全超时,损失超200万订单;有做企业内部RAG Agent的团队,上线后100人同时查询就把向量库打挂,还连累了其他业务的数据库;还有做多智能体系统的团队,压测只测了单请求性能,上线后多Agent交互超时率高达30%。

软件工程实践的博客 171

《Effective Java》解读第22条:接口只用于定义类型

接口应仅用于定义类型行为,而非承载常量。常量接口存在破坏封装性、污染命名空间等问题。推荐使用工具类(私有构造器+静态常量)、枚举或嵌套类组织常量。工具类示例: public final class PhysicalConstants { private PhysicalConstants() {} public static final double AVOGADROS_NUMBER = 6.022e23; } 嵌套类可增强分类(如ErrorCodes.Http.OK)。避免接口常量。

Cosmoshhhyyy的博客 653

FDTD仿真实战:从材料导入到反射率曲线分析

本文提供了一份完整的FDTD仿真实战指南,详细讲解了从自定义材料(如WO3)数据导入、结构建模、仿真区域与网格设置,到光源与监视器配置、运行仿真并提取反射率数据的全流程。重点解决了材料库缺失、网格优化、边界条件设置等常见难题,旨在帮助研究人员高效、准确地通过FDTD仿真获取材料的关键光学特性——反射率曲线。

elastic6hunter的博客 341

Effective Java 用标记接口定义接口类型

标记接口(marker interface) 是没有包含方法声明的接口,而只是指明(或者“标明”)一个类实现了具有某种属性的接口。例如,考虑Serilizable接口(第12章)。通过实现这个接口,表明类的实例可以被写到ObjectOutputStream(或者“被序列化”)。   你可能听说过标记注解(第39项)使得标记接口过时了。这种断言是不准确的。标记接口有两点胜过标记注解。首先,也是最重要的一点,标记接口定义的类型是由被标记类的实例实现的;标记注解则没有定义这样的类型。 标记接口类型的存在允许你在

菜园子丶For丨丶Tomorrow的博客 175

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

论文阅读--射频电源在半导体领域的应用

射频电源(RF Power Supply)是能够输出300kHz~300GHz正弦波电压的高频交流电源,在半导体制造领域,射频电源的典型工作频率范围为400kHz∼60 MHz,主要由射频发生器(功率源)、匹配器及配套控制电路组件构成,其关键组件包括变压器与电抗器、晶闸管、绝缘栅双极型晶体管(IGBT)、钣金件、铜材及各种电子元器件。射频电源是刻蚀和薄膜沉积工艺的核心,主要用于产生等离子体,以增强气体反应活性,其性能直接影响反应腔体内等离子体的浓度、均匀性和稳定性。

伊丽莎白的学习之路 2337

Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25

Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 本文主要介绍了类和接口相关的内容

weixin_44453385的博客 883

【计算机视觉】语义分割实战:FCN、U-Net与DeepLab系列详解

语义分割实战:FCN、U-Net与DeepLab系列详解,人工智能、大模型、AI深度学习在计算机视觉领域取得了令人瞩目的进展,语义分割作为计算机视觉领域的关键任务,旨在将图像中的每个像素都分配到特定的类别中,实现对图像内容的精细理解。与目标检测关注物体的类别与位置不同,语义分割能够对场景中的所有元素进行像素级别的分类,这在自动驾驶、医学图像分析、遥感图像解译等众多领域都有着至关重要的应用。例如,在自动驾驶中,准确的语义分割可以帮助车辆识别道路、行人、交通标志等,为安全行驶提供决策依据;在医学图像分析中……

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 9万+

Effective Java 第三版 中文翻译

effective-java-third-edition 介绍 Effective Java 第三版全文翻译,纯属个人业余翻译,不合理的地方,望指正,感激不尽! 目录 推荐序 前言 致谢 第一章 引言 第二章 创建和销毁对象   本章涉及创建和销毁对象,包括何时以及如何创建它们,何时以及如何避免创建它们,如何确保它们被及时销毁,以及如何管理在销毁之前必须进行的清理操作。 第1项:考虑静态工...

Coloured_Glaze的博客 3861

爬虫Incapsula reese84加密案例:Etihad航空(纯算法)

爬虫Incapsula reese84加密案例:Etihad航空,本文就不再讲解如何找加密参数、定位加密参数,以及分析加密的一个过程。就直接从扣算法开始,扣算法前先看之前讲解的加密函数生成的过程,文章会一个函数一个函数的讲解扣算法。fiddler根据规则替换本地文件。调试过程中遇到部分环境不一样是正常的,具体还要根据自己调试的js为准,就像之前补环境时是有二十一个循环,这次扣算法多出一个循环,不过大部分环境是一样的第一个函数:通过document.addEventListener添加了很多事件。

老衲爱洗头的博客 1992

Transformer实战(32)——Transformer模型压缩

在本节中,我们学习了如何在硬件资源受限的情况下减轻运行大模型的负担。我们介绍了如何通过蒸馏、剪枝和量化从训练好的模型中提取高效模型。预训练轻量级的通用语言模型(如 DistilBERT) 可以在各种任务上进行微调,并表现出与非蒸馏模型相当的性能。随着数据量的不断增加,我们希望模型能够更快地运行,在这方面,高效 Transformer 起着至关重要的作用。

盼小辉丶的博客 2562

Effective Java 读书笔记

读书笔记

white_while的博客 1648

图形推理2-四大类六提示

图形推理笔记2

小y的学习笔记 6743

Effective Java 高效编码阅读 笔记

函数参数可以传入类似listener的对象,目的是使用listener中的方法。如果使用匿名的参数,每一次调用会创建新的对象。可以将listener声明为成员变量,每次都复用同一个对象,并且可以使用静态域(static变量)。比如String类的域。

程序员小刘 1927

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【读书笔记】Effective Java(类和接口)

读书笔记-Effective Java(类和接口)

我的博客 392

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Effective.Java第12-22条

12. 始终重写toString()方法   如果不重写toString()方法,打印的时候是 类名+@+哈希码的无符号十六进制。我们查看 Object的toString()方法如下: public String toString() { return getClass().getName() + "@" + Integer.toHexString(h...

weixin_30293135的博客 148

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Effective Java

Effective Java 由于书本内容太枯燥,看不下去,只能对着抄。。加油ヾ(◍°∇°◍)ノ゙ 文章目录第一章 引言第二章 创建和销毁对象第1条 用静态工厂方法代替构造器第2条 遇到多个构造器参数时要考虑构建器第3条 用私有构造器或者枚举类型强化Singleton属性第4条 通过私有构造器强化不可实例化的能力第5条 优先考虑依赖注入来引用子源第6条 避免创建不必要的对象第7条 消除过期的对象引用第8条 避免使用终结方法和清除方法第9条 try-with-resources优先于try-finally第

lyw4631的博客 471

《Effective Java》学习笔记15--25

本栏是博主根据如题教材进行Java进阶时所记的笔记,包括对原著的概括、理解,教材代码的报错和运行情况。十分建议看过原著遇到费解地方再来参考或与博主讨论。致敬作者Joshua Bloch和各路翻译者们,以及为我提供可参考博文的博主们。 复制粘贴改格式好累,这几篇全都给出git地址,大家自己download下来看好了。或者想直接在浏览器上看可以考虑用这个名叫OctoTree的插件。安装教程网上大把,...

欢迎访问 花落的速度 的博客 322

Effective Java 3rd 条目22 仅仅定义类型时使用接口

当一个类实现一个接口时,这个接口起一个类型的作用,可以被用来引用这个类的实例。一个类实现了一个接口,应该因此说明一些事情:使用这个类的实例,一个类可以做什么。为任何其他目的而定义一个接口,都是不恰当的。 不符合这个检测的一种接口是所谓的常量接口(constant interface)。这样的接口不包含任何方法;它仅仅包含静态final域,每个域导出一个常量。使用这些常量的类实现这个接口,避免了用...

tigershin的专栏 289

Effective Java 学习总结

Effective Java 作为 Java 四大名著之一,聚焦于 Java 语言习惯和高效的用法。EJ 告诉读者如何更好地构建代码,以便代码能够更好地工作;也便于其他人能够理解这些代码,便于修改和改善;程序也会因此变得更加令人愉快,更加优雅。全书共90条,接下来笔者将逐条进行总结。不应该使用常量接口。一个类在内部使用某些常量是实现细节,常量接口会把这样的实现细节泄露到该类的导出 API 中标记接口:不包含方法声明的接口,它只是指明一个类实现了某种属性的接口。

Alioth4J的博客 2255

Effective Java(第3版)总结

创建和销毁对象 1、用静态工厂方法代替构造器 2、遇到多个构造器参数时要考虑使用构建器 3、用私有构造器或者枚举类型强化Singleton属性 4、通过私有构造器强化不可实例化的能力 5、优先考虑依赖注入来引用资源 6、避免创建不必要的对象 7、消除过期的对象引用 8、避免使用终结方法和清除方法 9、try-with-resources优先于try-finally 对于所有对象都通用的方法 10、覆盖equals时请遵守通用约定 11、覆盖equals时总要覆盖hashCode 12、始终要覆盖toStr.

chenjingwo4的博客 485

Effective Java 经典学习(一)

  (尊重劳动成果,转载请注明出处:https://blog.youkuaiyun.com/qq_25827845/article/details/85016496冷血之心的博客) 系列文章: Effective Java经典学习(一) 目录 第二章:创建和销毁对象 (1)使用静态工厂方法代替构造器 (2)遇到多个构造器参数时要考虑用构建器 (3)用私有构造器或者枚举类型强化Singleton...

冷血之心的博客 8618

【effective java】13~22.类和接口

第13条:使类和成员的可访问性最小化Java通过封装和修饰符等手段限制访问权限,尽量降低类的可访问性,可以降低风险,应成员变量和成员方法的访问权限降低,尤其是成员变量,尽量使用private修饰,如果不是很有必要,不要使用成员变量,成员变量在并发条件下容易引发线程安全问题,为了防止出现这种问题,使用同步等方式会增加开销。第14条:在公有类中使用访问方法而非公有域尽量使用getter()/sette...

左耳听风的博客 293

Effective Java 类和接口 第21条:用函数对象表示策略

有些语言支持函数指针、代理、lambda表达式,或者支持类似的机制,允许程序把“调用特殊函数的能力”储存起来并传递这种能力。这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为。 比较器函数有两个参数,都是指向元素的指针。如果第一个参数所指的元素小于第二个参数所指的元素,则返回一个负整数;如果两个元素相等则返回零;如果第一个参数所指的元素大雨第二个,则返回一个正整数。通过传递不同...

yancyang的博客 1万+

effective java 学习笔记

最近看了下《effective java》,非常热评的一本入门级别的java类书籍。借此机会,将上面的知识点结合我的一些看法按照item的形式一一列出,希望一直在编程中牢记这些规则,并且熟悉运用。 规则如下: 1. 用静态工厂代替构造函数,尽量避免类的无必要的创建,并且需要遵循一些,静态方法的命名规则,如valueOf,getInstatnce 2. 避免创建重复对象...

attis_wong的博客 152
上一篇: Effective Java笔记(21)为后代设计接口
下一篇: Effective Java笔记(23)类层次优于标签类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值