SOLID Principles in Java2025年7月21日 | 阅读 12 分钟 在 Java 中,SOLID 原则代表了应用于软件结构设计的一种面向对象的方法。由 Robert C. Martin(也称为 Uncle Bob)构思的这五项原则彻底改变了面向对象编程的世界,并改变了软件的编写方式。 通过遵循 SOLID 原则,开发人员可以确保他们的软件是模块化的、易于理解、调试和重构的。SOLID 原则不仅提高了代码质量,还促进了更好的维护和可扩展性,最终实现了更健壮、更高效的软件系统。 SOLID 首字母缩写代表
![]() 下面我们逐一详细解释这些原则。 单一职责原则单一职责原则指出,每个 Java 类都必须执行一个单一的功能。在一个类中实现多个功能会使代码混乱,如果需要进行任何修改,可能会影响整个类。它精简了代码,代码更容易维护。让我们通过一个例子来理解单一职责原则。 假设 Main 是一个类,它有三个方法:printDetails()、calculatePercentage() 和 addStudent()。因此,Main 类有三个职责:打印学生详细信息、计算百分比和数据库操作。通过使用单一职责原则,我们可以将这些功能分离到三个单独的类中,以实现该原则的目标。 示例编译并运行输出 Adding a new student... Printing student details... Calculating percentage... 上面的程序违反了单一职责原则。为了达到目标,我们应该实现单独的类(如下),它们只执行一个功能。 Student.java PrintStudentDetails.java Percentage.java 因此,通过将功能分离到三个单独的类中,我们实现了单一职责原则的目标。 这种分离增强了模块化,使每个类更容易独立测试、维护和演进。 开闭原则应用程序或模块实体(方法、函数、变量等)。开闭原则指出,根据新的需求,模块应该对扩展开放,对修改关闭。扩展允许我们在模块中实现新功能。让我们通过一个例子来理解这个原则。 如果我们想添加一个名为 Truck 的新子类,只需添加另一个 if 语句,这会违反开闭原则。添加子类并实现该原则目标的唯一方法是重写 vehicleNumber() 方法,如下所示。 示例编译并运行输出 Car Number: 7884 Truck Number: 7884 同样,我们可以通过创建一个从 vehicleInfo 类继承的子类来添加更多车辆。这种方法不会影响现有应用程序。 此原则有助于编写灵活且可扩展的代码,能够适应不断变化的需求。 里氏替换原则Barbara Liskov 引入了里氏替换原则 (LSP)。它适用于继承,使得派生类必须能够完全替换其基类。换句话说,如果类 A 是类 B 的子类型,那么我们应该能够在不中断程序行为的情况下用 A 替换 B。 它扩展了开闭原则,并且还关注超类及其子类型的行为。我们应该设计类以保持其属性,除非有充分的理由不这样做。让我们通过一个例子来理解这个原则。 示例编译并运行输出 Height: 1.8 Weight: 75.0 BMI: 23.148148148148145 上面的类违反了里氏替换原则,因为 StudentBMI 类有额外的约束,即高度和体重必须相同。因此,Student 类(基类)不能被 StudentBMI 类(派生类)替换。 因此,用 StudentBMI 类替换 Student 类可能会导致意外行为。 遵循 LSP 可确保多态性无缝运行,允许对象互换使用而不会出现意外行为。 接口隔离原则该原则指出,大型接口应拆分成更小的接口。因为实现类只使用所需的方法,所以我们不应该强迫客户端使用它们不想使用的技术。 接口隔离原则的目标与单一职责原则相似。让我们通过一个例子来理解这个原则。 ![]() 假设我们创建了一个名为 Conversion 的接口,它有三个方法:intToDouble()、intToChar() 和 charToString()。 上面的接口有三个方法。如果我们只想使用 intToChar() 方法,我们别无选择,只能实现这一个方法。为了解决这个问题,该原则允许我们将接口拆分成三个独立的接口。 现在,我们可以只使用所需的方法。假设我们要将整数转换为双精度,并将字符转换为字符串。那么,我们将只使用 intToDouble() 和 charToString() 方法。 该原则促进了更清晰的接口设计,并通过仅公开真正必要的内容来减轻实现类的负担。 依赖倒置原则该原则指出,我们必须使用抽象(抽象类和接口)而不是具体实现。高层模块不应该依赖于低层模块,而两者都应该依赖于抽象。因为抽象不依赖于细节,而细节依赖于抽象。它解耦了软件。让我们通过一个例子来理解这个原则。 如果我们没有键盘和鼠标在 Windows 上工作,那也是值得的。为了解决这个问题,我们创建一个类的构造函数,并添加键盘和显示器的实例。添加实例后,类看起来如下。 现在我们可以通过键盘和鼠标在 Windows 机器上工作了。但我们仍然面临问题。因为我们使用 new 关键字将三个类紧密耦合在一起,所以很难测试 WindowsMachine 类。 为了使代码松耦合,我们通过使用 Keyboard 接口和此关键字来解耦 WindowsMachine 与键盘。 Keyboard.java 让我们通过一个例子来理解这个原则。 示例编译并运行输出 Typing on a Mechanical Keyboard: Hello World Displaying on LED Monitor: Welcome to Windows 在上面的代码中,我们使用了依赖注入将键盘依赖项添加到 WindowsMachine 类中。因此,我们解耦了类。 ![]() 为什么我们应该使用 SOLID 原则?
下次设计软件时,请牢记这五个原则。通过应用这些原则,代码将更加清晰、可测试和可扩展。 通过遵循 DIP,我们解耦了组件,提高了可重用性,并使系统更容易测试和维护。 SOLID 原则的优点1. 增强的可维护性
2. 改进的可测试性
3. 可扩展性和灵活性
4. 增强的可读性和理解性
5. 提高可重用性
6. 减少技术债务
7. 协作和团队效率
8. 提高性能
9. 未来保障
要记住的重要事项
结论这些原则是使面向对象的 Java 软件强大、易于维护和可扩展的基础。当使用这五项原则时,软件系统将变得更易于解释、测试和更新。 遵循这些原则的结果是,开发人员看到了改进的代码组织、更少的重复部分,以及为其软件和未来的活动带来了更好的结果。无论应用程序的大小如何,坚持 SOLID 原则都能确保代码库能够适应、保持稳定并符合当今的标准。 Java SOLID 原则选择题1. 哪个 SOLID 原则规定一个类应该只有一个改变的原因?
答案:1 解释:单一职责原则 (SRP) 指出,一个类应该只有一个改变的原因,这意味着它应该只有一个工作或职责。 2. 开闭原则建议软件实体应该
答案:2 解释:开闭原则 (OCP) 指出,软件实体(如类、模块、函数)应该对扩展开放,但对修改关闭,允许在不更改现有代码的情况下添加新功能。 3. 根据里氏替换原则,子类应该 ______________。
答案:2 解释:里氏替换原则 (LSP) 指出,子类的对象应该能够替换父类的对象,而不影响程序的正确性。 4. 哪个原则鼓励高层模块依赖于抽象而不是具体实现?
答案:4 解释:依赖倒置原则 (DIP) 指出,高层模块应依赖于抽象(接口)而不是具体实现,从而促进代码的解耦和灵活性。 5. 以下哪项陈述最能描述接口隔离原则?
答案:2 解释:接口隔离原则 (ISP) 指出,客户端不应被迫依赖他们不使用的接口,提倡使用更小、更具体的接口而不是大型、通用的接口。 下一主题Java 工厂设计模式的实际示例 |
传统上,我们使用算术运算(/)进行除法。除法运算在某些场合需要替代实现,因为系统限制、特定编码要求或对底层除法逻辑的好奇。除法的核心在于确定……
阅读 6 分钟
在 Java 中,并发中使用原子变量和操作。多线程环境在并发统一时会导致问题。共享实体,如对象和变量,可能在程序执行期间被更改。因此,它们可能导致程序不一致……
阅读 6 分钟
全字母句是一个字符串,其中包含英文字母表中的所有字母至少一次。这是一个典型的编程练习,因为它涉及字符串操作、数据模型和算法。在本节中,我们将学习到底什么是…
阅读 4 分钟
Java 5 中引入的泛型为开发人员编写和使用 Java 集合的方式带来了革命性的变化。泛型允许类和方法对各种类型的对象进行操作,同时提供编译时类型安全。这一强大功能具有许多优点,有助于编写更清晰、更...
阅读 4 分钟
Java 提供了多种数据系统,允许开发人员有效处理记录集合。当涉及多个线程时,并发集合对于确保数据完整性和线程安全至关重要。在本节中,我们将探讨并发...
5 分钟阅读
Eclipse 是开发人员最常用和最受欢迎的 IDE 之一。它具有开箱即用的功能,使其在其他 IDE 中脱颖而出。有多种因素会影响我们有效和高效地编写代码的能力。从由 AI 驱动的代码补全辅助到...
阅读 2 分钟
在软件开发领域,高效地解决基于数组的问题至关重要,尤其是在技术面试和竞争性编程中。一个这样的问题是找到未排序数组中缺失的最小正数。这个问题考验了程序员操作和遍历数组的能力,以及...
阅读 6 分钟
模型-视图-控制器(MVC)是 Web 开发领域中一个*著名的设计模式*。它是一种*组织代码的方式*。它规定程序或应用程序应由*数据模型*、*表示信息*和*控制信息*组成。MVC 模式需要所有这些组件...
阅读 8 分钟
图像处理是计算机科学领域一个引人入胜的领域,涵盖了分析和操作图像的广泛操作。在图像处理中最基本但又最有趣的任务之一是生成具有随机彩色像素的图像。这项任务可以作为...
阅读 4 分钟
JSON 是一种数据交换格式。它是一种广泛使用、轻量级且与语言无关的格式。它能够将数据从 JSON 转换为 XML。Java 提供了大量的 JSON 包。借助这些包,我们可以从 JSONObject 检索或获取值。
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India