Effective Java笔记(25)限制源文件为单个顶级类

set_output_delay的本质 阅读详情

        虽然 Java 编译器允许在一个源文件中定义多个顶级类,但这么做并没有什么好处,只会带来巨大的风险 。 因为在一个源文件中定义多个顶级类,可能导致给一个类提供多个定义 。 哪一个定义会被用到,取决于源文件被传给编译器的顺序 。

        为了更具体地说明,下面举个例子,这个源文件中只包含一个 Main 类,它将引用另外两个顶级类( Utensil 和 Dessert )的成员:

public class Main {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
}

        现在假设你在一个名为 Utensil.java 的源文件中同时定义了 Utensil 和 Dessert :

class Utensil {
    static final String NAME = " pan";
}
class Dessert {
    static final String NAME = "cake";
}

当然,主程序会打印出“ pancake ” 。

现在假设你不小心在另 一 个名为 Dessert. java 的源文件中也定义了同样的两个类 :

class Utensil {
    static final String NAME = "pot" ;
}
class Dessert {
    static final String NAME = "pie";
}

        如果你侥幸是用命令 javac Main.java Dessert.java 来编译程序, 那么编译就会失败 , 此时编译器会提醒你定义了多个 Utensil和 Dessert 类 。 这是因为编译器会先编译Main.java ,当它看到Utensil 的引用(在 Dessert 引用之前),就会在 Utensil. java中查看这个类,结果找到 Utensil 和 Dessert 这两个类 。 当编译器在命令行遇到 Dessert.java 时,也会去查找该文件,结果会遇到 Utensil 和 Dessert 这两个定义 。

        如果用命令 javac Main.java 或者 javac Main.java Utensil.java 编译程序,结果将如同你还没有编写 Dessert.java 文件一样,输出 pancake 。 但如果是用命令 javac Dessert.java Main java 编译程序,就会输出 potpie 。 程序的行为受源文件被传给编译器的顺序影响,这显然是让人无法接受的 。

        这个问题的修正方法很简单,只要把顶级类(在本例中是指 Utensil 和 Dessert )分别放入独立的源文件即可 。 如果一定要把多个顶级类放进一个源文件中,就要考虑使用静态成员类,以此代替将这两个类分到独立源文件中去 。 如果这些类服从于另一个类,那么将它们做成静态成员类通常比较好,因为这样增强了代码的可读性,如果将这些类声明为私有的,还可以使它们减少被读取的概率 。 以下就是做成静态成员类的范例:

public class Test {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert . NAME);
    }
    private static class Utensil {
        static final String NAME = "pan";
    }
    private static class Dessert {
        static final String NAME = "cake";
    }
}

        结论显而易见 : 永远不要把多个顶级类或者接口放在一个源文件中 。 遵循这个规则可以确保编译时一个类不会有多个定义 。 这么做反过来也能确保编译产生的类文件,以及程序结果的行为,都不会受到源文件被传给编译器时的顺序的影响 。

[Python] 如何使用 Python 调用 Dify 工作流服务实现自动化翻译 本文介绍了如何使用Python调用Dify的API实现文本翻译自动化。Dify作为AI开发平台,其工作流功能可执行文本处理、翻译等任务。选择Python调用Dify的优势在于职责划分清晰:Dify专注AI服务,Python处理文件操作等非AI任务。 阅读详情

相关推荐

【HDLBits实战】从真值表到最优电路:SOP与POS形式在ECE241考题中的精妙应用

本文以HDLBits平台上的ECE241考题为例,详细讲解了如何从真值表出发,利用卡诺图化简技术,推导出最优的积之和(SOP)与和之积(POS)逻辑表达式。文章重点剖析了如何处理“无关项”以简化电路,并通过Verilog代码实现对比,阐述了SOP与POS形式在数字电路设计中的精妙应用与实战价值。

z2a3b4c5d的博客 216

Effective Java笔记:限制源文件为单个顶级类

而开发者在写代码时,可能会误以为这些包级私有类是封装的,从而在同一包的其他类中错误地使用了它们。当文件中包含多个类时,开发者必须深入阅读代码才能弄清楚文件中到底有哪些类以及它们的用途。如果某些类确实与顶级类紧密关联,只在其中范围使用,使用嵌套类代替顶级类。在源文件中定义多个顶级类可能导致文件管理的混乱,特别是在跨包引用的情况下。将每个顶级类放在单独的文件中,能让团队更好地管理和协作,减少冲突,同时提升代码审查的效率。的顶级类,那么源文件的名称必须与该类的名称完全相同(包括大小写)。且不嵌套在其他类中的类。

eclipseC的博客 416

IEEE Access投稿全流程:从LaTeX模板到Overleaf实战(附避坑指南)

本文详细解析了向IEEE Access期刊投稿的完整流程,重点介绍了如何使用LaTeX模板在Overleaf平台上高效撰写和格式化论文。内容涵盖模板选择、作者信息填写、公式图表排版、参考文献管理(BibTeX)以及投稿前的最终检查清单,旨在帮助研究者,尤其是LaTeX新手,规避常见技术问题,顺利完成符合期刊严格要求的稿件提交。

open4的博客 576

《Effective Java》解读第25条:限制源文件为单个顶级类

摘要: Java源文件应遵循"一个文件一个顶级类"原则,文件名与公共类名保持一致。该规则提升代码清晰度、可维护性和构建可靠性: 便于快速定位和理解代码结构 避免重构时产生副作用 防止编译顺序导致的不可预测行为 消除命名空间混乱风险 例外情况仅限紧密关联的辅助类或测试代码,但更推荐使用静态嵌套类。主流IDE默认支持此规范,违反规则带来的微小便利远不及潜在风险,应作为强制纪律遵守。

Cosmoshhhyyy的博客 951

瑞芯微RK3568开发板实战:Android11系统parameter.txt文件配置全解析(附常见问题排查)

本文深入解析了瑞芯微RK3568开发板在Android 11系统下parameter.txt文件的配置要点与实战技巧。作为BootLoader启动阶段的核心蓝图,该文件决定了硬件初始化、分区布局及电源管理。文章详细拆解了身份标识、GPIO控制(PWR_HLD)、命令行参数及分区表等关键字段的配置逻辑,并针对RK3568平台与Android 11特性提供了专项适配策略,最后附带了启动失败、分区异常等常见问题的深度排查方法。

php55的博客 895

YOLOv8 + TensorRT 实战:手把手教你用 C++ 实现实时视频流目标检测(附完整项目代码)

本文详细介绍了如何将YOLOv8与TensorRT结合,通过C++实现实时视频流目标检测的全流程。从环境配置、模型转换优化到视频处理架构设计,手把手教你构建高性能检测系统,并附完整项目代码。特别针对Windows平台下的TensorRT模型加速部署提供了实用技巧和性能优化方案。

weixin_29051193的博客 346

《Effective Java》第25条:限制源文件为单个顶级类

原文P92:永远不要把多个顶级类或者接口放在一个源文件中。但是当再从 Dessert.java 源文件中定义 Utensil类 和 Dessert类,在idea中,程序就会编译出错,编译器会提醒你定义了多个Utensil 和Dessert类。正常情况下,在Utensil.java 源文件中定义 Utensil类 、在 Dessert.java 源文件中定义 Dessert类。Java允许我们在一个Java文件中,定义多个顶级类,并且可以正常编译和使用,但是这种方式是没有任何好处的,只会带来巨大的风险。

TD_FAlmK的博客 299

Robot Arm 机械臂源码解析

由于我们用的是步进电机,运动的时候是一步一步的,并不是平滑的,这里假设在一个平面上面,一个x步进电机,一个y步进电机。那么放大它们所走的轨迹就会是阶梯状的。而它们也只能沿着网格运动。相当于有了一个最小的分辨率,这个分辨率就是一步。如下图所示,如果x,y电机同时走就能走出45度的斜线。在三维空间里面运动也是如此,你应该可以想象的出来;首先,是updateActualPosition,用来时时更新此时的差补位置,得到的是一个路径与时间t的函数(其中路径的范围为0,1,时间范围为0,dist/v)...

爱吃炸鸡的小猪's blog 1万+

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

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

weixin_44453385的博客 883

lvgl 实现表格table,并且固定表头

嵌入式实现table,lvgl 实现原生表格table组件

m0_61704502的博客 1271

SAP UI5 本地开发工具 fiori-tools-proxy 中间件详解及使用场景

该中间件基于 http-proxy-middleware 库实现,分为 ui5 资源代理和 backend 代理两大模式,并可与 fiori run 或 ui5 serve 命令无缝集成,通过配置 ui5.path、ui5.url 以及 backend.path、backend.url 等参数,实现与目标系统的灵活对接和安全配置 (就后端系统代理而言,fiori-tools-proxy 内置 @sap-ux/backend-proxy-middleware,可将以指定前缀(如。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 517

《Effective Java》类和接口

《Effective Java》第三章 类和接口

qq_43350524的博客 1014

在isaacsim仿真系统进行遥操作(设备是quest3):怎么让遥操作设备(quest3)在Isaac sim系统中控制机械臂并把其中的参数传输出来??

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

**My Coding Family** 942

Effective Java 3rd 条目25 将源文件限制在单个顶层类

虽然Java编译器让你在单个源文件中定义多个顶层类,但是这么做没有任何益处。危险性来自这个事实:在单个源文件中定义多个顶层类,使得为一个类提供多个定义变得可能。使用哪个定义,受传递到编译器的源文件顺序的影响。 为了使得这具体些,考虑如下源文件,它仅仅包含了一个Main类,这个类引用另外两个顶层类(Utensil和Dessert)的成员: public class Main { p...

tigershin的专栏 263

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[Java读书笔记] Effective Java(Third Edition) 第 4 章 类和接口

第 15 条: 使类和成员的可访问性最小化 软件设计基本原则:信息隐藏和封装。 信息隐藏可以有效解耦,使组件可以独立地开发、测试、优化、使用和修改。 经验法则:尽可能地使每个类或者成员不被外界访问。 对于成员(属性、方法、嵌套类和嵌套接口),有四种可能的访问级别,在这里,按照可访问性从小到大列出: private —— 该成员只能在声明它的顶层类内访问。 ...

weixin_30702887的博客 221

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Effective Java 第三版 中文翻译

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

Coloured_Glaze的博客 3861

android 蓝牙通讯demo

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

Effective Java笔记:使类和成员的可访问性最小化

即通过隐藏实现细节,仅暴露必要的接口,来降低模块之间的耦合性。在设计公共类时,需要特别小心它的 API,因为一旦发布,修改它可能会破坏跟它交互的代码。在声明类和成员时,尽可能限制其访问权限,使其可见性最小化。字段是不可变的,但它仍然破坏了封装,因为类的实现细节(如错误代码字符串)对外公开。修饰的数组或集合使得对内部数据的修改权限不受控制,这是一个常见的过失设计。实现类(如接口的具体实现)通常是特定于模块的细节,不应直接暴露给外部。,允许子类复用父类的逻辑,但仍需谨慎设计受保护的成员。

eclipseC的博客 1152

Effective Java 第三版读书笔记(类和接口)

第15条.使类和成员的可访问性最小化 对于成员有四种可访问级别: 1.私有的(private)----- 只有在声明该成员的顶层类内部才可以访问这个成员。 2.包级私有的(package-private)----- 声明该成员的包内部的任何类都可以访问这个成员,也是默认访问级别,接口成员除外,接口成员默认的访问级别是公有的。 3.受保护的(protected)----- 声明该成员的类...

qq_27707957的博客 340

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

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

我的博客 392

《Effective Java 3rd》读书笔记——类和接口

使类和成员的可访问性最小化 区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其内部数据和其他实现细节。 尽可能地使每个类或成员不被外界访问。 对于顶层的(非嵌套的)类和接口,能做成包级私有的,就应该被做成包级私有(即不加任何修饰符)。这样就可以随心所欲的对其进行修改或删除。 如果一个包级私有的顶层类(或接口)只是在某一个类的内部被用到,那就应该考虑使它成为唯一使用...

日积月累,天道酬勤 633

Effective Java读书笔记

第一章 引言 本文用来记录Effective Java学习过程中的各个知识点,受此时能力所限,有些点可能讲的不太清楚,或者理解有错误的地方,请多多指教! 第二章 创建和销毁对象 第一条 用静态工厂方法代替构造器 可参考文章:https://blog.youkuaiyun.com/u014129886/article/details/89670049 总而言之,静态工厂方法和共有构造器各有各的用处,我们需要理解他们各自的长处,静态工厂经常更加合适。 此处的静态工厂方法与设计模式中的工厂模式不同,这里是一种构造

逆水行舟,不进则退 1441

【Effective Java】第4章 读书笔记

第4章 类和接口 15,使类和成员可访问性最小化 尽可能地使每个类或者成员不能被外界访问。 公有类的实例域绝不能是公有的。 包含公有可变域的类通常并不是线程安全的。 让类具有公有的静态 final 数组域,或者这种域的访问方法是错误的。 16,要在公有类中使用访问方法而非公有域 公有类永远都不要暴露可变的的域 17,使可变性最小化 不可变类是指实例不可以被修改的类 17.1 不可变类要遵循的五条原则: 不要提供任何可以修改对象状态的方法。 保证类不会被扩展。 声明所有的域都是 final 的。 声明所有的

qq_45050687的博客 1330

Effective Java 读书笔记

读书笔记

white_while的博客 1648

Effective Java读书笔记-8

这么做反过来也能确保编译产生的类文件,以及程序结果的行为,都不会受到源文件被传给编译器时的顺序的影响。

weixin_42583701的博客 119

Effective Java

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

lyw4631的博客 471

带你快速看完9.8分神作《Effective Java》—— 类和接口篇

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2022年1月7日 ???? 个人简介:通信工程本硕????、阿里新晋猿同学????。我的故事充满机遇、挑战与翻盘,欢迎关注作者来共饮一杯鸡汤 ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! 15 使类和成员的可访问性最小化 面向对象语言设计时的两大“法宝”就是封装和解耦。其中,封装可以隐藏组件所有的实现细节,把API与实现清晰隔离开,因此也就解除组成系

如切如磋,如琢如磨 1957
上一篇: Effective Java笔记(24)静态成员类优于非静态成员类
下一篇: Java网络编程(三)Socket通信代码示例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值