当前位置: 首页 > news >正文

Java 中实体类与操作类分离

目录

一、为啥要把实体类和操作类分开

二、实体类长啥样,怎么用

三、操作类的使命与实现

四、实战演练:实体类与操作类协同工作

五、拓展思考:这种分离带来的好处与进一步优化

六、总结与展望


家人们,今天我想跟你们唠唠我在学习 Java 编程时发现的一个特别好用的编程技巧 —— 将实体类和操作类相分离。这就好比把家里的东西分类摆放,找起来方便,用起来也顺手。在编程里,这样做能让代码结构更清晰,维护和扩展都轻松不少,跟我一起来深入了解一下吧!

一、为啥要把实体类和操作类分开

咱们先从生活中的例子说起。就拿做饭来说,食材就像是实体类,它们有自己的特性,比如大米是主食,西红柿是蔬菜,各有各的属性。而做饭的过程,像炒菜、煮饭这些操作,就像是操作类。如果把食材和做饭的操作都混在一起,厨房肯定乱成一锅粥,找个食材都费劲,做饭也容易出错。在 Java 编程里也是这个道理。

实体类主要用来描述数据的结构和属性,它就像一个装满信息的小盒子,比如一个 “学生” 实体类,里面装着学生的姓名、年龄、学号这些信息。而操作类则专注于对这些数据进行操作,比如添加学生信息、查询学生成绩等。要是把这两者混在一个类里,代码就会变得混乱不堪,难以理解和维护。把它们分开,就可以让每个类各司其职,代码结构一目了然。

二、实体类长啥样,怎么用

咱们以一个简单的 “图书” 实体类为例,看看它的庐山真面目。

public class Book {private String title;private String author;private int publicationYear;private String isbn;public Book(String title, String author, int publicationYear, String isbn) {this.title = title;this.author = author;this.publicationYear = publicationYear;this.isbn = isbn;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public int getPublicationYear() {return publicationYear;}public void setPublicationYear(int publicationYear) {this.publicationYear = publicationYear;}public String getIsbn() {return isbn;}public void setIsbn(String isbn) {this.isbn = isbn;}
}

在这个 “Book” 类里,我们用私有成员变量来存储图书的属性,这样可以保证数据的安全性,防止外部随意修改。通过构造器,我们可以在创建图书对象时,一次性给这些属性赋值。而 getter 和 setter 方法则提供了对这些属性的访问和修改接口,让外部代码可以在一定的规则下操作这些数据。

在实际使用中,我们可以这样创建一个图书对象:

Book book = new Book("Java核心技术", "Cay S. Horstmann", 2020, "9787111640788");

这样就创建了一本名为《Java 核心技术》,作者是 Cay S. Horstmann,出版于 2020 年,ISBN 号为 9787111640788 的图书对象。

三、操作类的使命与实现

现在我们有了实体类,接下来看看操作类该怎么写。假设我们要实现一个简单的图书管理功能,比如添加图书、查询图书信息等,就可以创建一个 “BookManager” 操作类。

import java.util.ArrayList;
import java.util.List;public class BookManager {private List<Book> books = new ArrayList<>();public void addBook(Book book) {books.add(book);System.out.println("图书 " + book.getTitle() + " 已成功添加到图书馆。");}public Book findBookByTitle(String title) {for (Book book : books) {if (book.getTitle().equals(title)) {return book;}}System.out.println("未找到名为 " + title + " 的图书。");return null;}public void displayAllBooks() {if (books.isEmpty()) {System.out.println("图书馆中没有图书。");} else {System.out.println("图书馆中的所有图书:");for (Book book : books) {System.out.println("书名:" + book.getTitle() + ",作者:" + book.getAuthor() + ",出版年份:" + book.getPublicationYear() + ",ISBN:" + book.getIsbn());}}}
}

在这个 “BookManager” 类中,我们用一个列表来存储所有的图书对象。“addBook” 方法用于将一本图书添加到列表中,并打印添加成功的提示信息。“findBookByTitle” 方法通过书名来查找图书,如果找到了就返回对应的图书对象,找不到则打印提示信息并返回 null。“displayAllBooks” 方法用于展示图书馆中所有图书的信息,如果图书馆没有图书,也会打印相应的提示。

四、实战演练:实体类与操作类协同工作

现在,让我们看看实体类和操作类是如何协同工作的。

public class Main {public static void main(String[] args) {BookManager manager = new BookManager();Book book1 = new Book("Effective Java", "Joshua Bloch", 2018, "9787111595850");Book book2 = new Book("Clean Code", "Robert C. Martin", 2008, "9780132350884");manager.addBook(book1);manager.addBook(book2);manager.displayAllBooks();Book foundBook = manager.findBookByTitle("Effective Java");if (foundBook!= null) {System.out.println("找到的图书信息:");System.out.println("书名:" + foundBook.getTitle() + ",作者:" + foundBook.getAuthor() + ",出版年份:" + foundBook.getPublicationYear() + ",ISBN:" + foundBook.getIsbn());}}
}

在这个主程序中,我们首先创建了一个 “BookManager” 对象,然后创建了两本图书对象。接着,我们使用 “BookManager” 的 “addBook” 方法将这两本图书添加到图书管理系统中。之后,调用 “displayAllBooks” 方法展示所有图书的信息。最后,通过 “findBookByTitle” 方法查找一本名为《Effective Java》的图书,并打印出它的详细信息。

运行这段代码,我们可以看到控制台输出了图书的添加信息、所有图书的信息以及查找图书的结果,这表明实体类和操作类成功地协同工作,实现了我们预期的图书管理功能。

五、拓展思考:这种分离带来的好处与进一步优化

将实体类和操作类分离,除了让代码结构清晰之外,还有很多好处。比如,当我们需要对图书的属性进行修改时,只需要在 “Book” 实体类中进行操作,而不会影响到 “BookManager” 中的操作逻辑。同样,当我们要扩展图书管理功能,比如添加删除图书、统计图书数量等功能时,只需要在 “BookManager” 类中添加相应的方法,不会对 “Book” 类造成影响。

进一步优化的话,我们可以考虑使用设计模式来让代码更加灵活和可维护。例如,我们可以使用单例模式来确保 “BookManager” 类只有一个实例,避免重复创建对象造成资源浪费。或者使用工厂模式来创建图书对象,这样可以将对象的创建逻辑和使用逻辑进一步分离。

六、总结与展望

家人们,今天我们一起学习了 Java 中实体类和操作类相分离的技巧,通过代码示例,我们看到了这种方式如何让代码更加清晰、易于维护和扩展。希望你们通过这篇文章,对 Java 编程有了新的认识和理解。在以后的编程实践中,不妨尝试运用这种方法,相信会给你带来意想不到的收获。要是之后我又学到啥好玩的编程知识,再回来跟大伙分享,祝家人们生活愉快,编程之路越走越顺!

相关文章:

Java 中实体类与操作类分离

目录 一、为啥要把实体类和操作类分开 二、实体类长啥样&#xff0c;怎么用 三、操作类的使命与实现 四、实战演练&#xff1a;实体类与操作类协同工作 五、拓展思考&#xff1a;这种分离带来的好处与进一步优化 六、总结与展望 家人们&#xff0c;今天我想跟你们唠唠我在…...

【STM32HAL-----GPIO】

1. 什么是GPIO&#xff1f;&#xff08;了解&#xff09; 2. STM32 GPIO简介 2.1. GPIO特点 2.2. GPIO电气特性 2.3. GPIO引脚分布图 IO引脚分布特点&#xff1a;按组存在、组数视芯片而定、每组最多16个IO引脚。 3. IO端口基本结构介绍 4. GPIO八种工作模式 4.1. 输入浮空 特…...

Java Web开发高级——单元测试与集成测试

测试是软件开发的重要环节&#xff0c;确保代码质量和功能的正确性。在Spring Boot项目中&#xff0c;单元测试和集成测试是常用的两种测试类型&#xff1a; 单元测试&#xff1a;测试单个模块&#xff08;如类或方法&#xff09;是否按预期工作。集成测试&#xff1a;测试多个…...

编译chromium笔记

编译环境&#xff1a; windows10 powershell7.2.24 git 2.47.1 https://storage.googleapis.com/chrome-infra/depot_tools.zip 配置git git config --global user.name "John Doe" git config --global user.email "jdoegmail.com" git config --global …...

Web开发 -前端部分-CSS3新特性

1 CSS概述 2 CSS3私有前缀 3 CSS3的长度单位 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

【基础篇】什么是SQL注入,如何防止?

什么是 SQL 注入&#xff0c;如何防止&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全漏洞&#xff0c;它发生在 Web 应用程序中&#xff0c;当恶意用户在输入数据时&#xff0c;将恶意的 SQL 代码插入到输入中&#xff0c;从而导致应用程序…...

Swift语言的数据结构

Swift语言的数据结构 Swift是一种现代化的编程语言&#xff0c;它以安全性、性能和简洁性著称。尽管Swift通常被视为面向对象的语言&#xff0c;但它也支持函数式编程的特性&#xff0c;使得开发者可以以多种方式构建应用程序。在Swift中&#xff0c;数据结构是编程的基础&…...

牛客周赛 Round 77

题目链接&#xff1a;牛客周赛 Round 77 A. 时间表 tag&#xff1a;签到 B. 数独数组 tag&#xff1a;签到 Description&#xff1a;给定n个数&#xff0c;每个数的范围为1-9&#xff0c;问能否经过排列&#xff0c;使其每个长度为9的连续子数组都包含1-9这9个数字。 Sol…...

浅谈云端编辑器,分析其亮点与不足

浅谈云端编辑器&#xff0c;分析其亮点与不足 这个云端编辑器界面可以分为左侧题目筛选栏、中间题目描述与代码编辑区域、右侧AI提示功能三部分。以下是详细的分析&#xff1a; 1. 左侧题目筛选栏 层次结构清晰&#xff1a;左侧栏展示了一个层级结构&#xff0c;题目按主题分…...

web应用引入cookie机制的用途和cookie技术主要包括的内容

web应用引入cookie机制&#xff0c;用于用户跟踪。 &#xff08;1&#xff09;HTTP响应报文中的Cookie头行&#xff1a;set-Cookie &#xff08;2&#xff09;用户浏览器在本地存储、维护和管理的Cookie文件 &#xff08;3&#xff09;HTTP请求报文中的Cookie头行&#xff1a;…...

【HTML+CSS】使用HTML与后端技术连接数据库

目录 一、概述 1.1 HTML前端 1.2 后端技术 1.3 数据库 二、HTML表单示例 三、PHP后端示例 3.1 连接数据库 3.2 接收数据并插入数据库 四、安全性 4.1 防止SQL注入 4.2 数据验证与清洗 五、优化 5.1 索引优化 5.2 查询优化 六、现代Web开发中的最佳实践 6.1 使用…...

「2024·我的成长之路」:年终反思与展望

文章目录 1. 前言2.创作历程2.1 摆烂期2.2 转变期3. 上升期 2. 个人收获3.经验分享4. 展望未来 1. 前言 2025年1月16日&#xff0c;2024年博客之星入围公布&#xff0c;很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年&#xff0c;是意义非凡的一年&#xff0c;是充…...

C#PaddleOCRSharp使用

using PaddleOCRSharp;namespace PaddleOCRSharpDemo {internal class Program{static void Main(string[] args){//中英文模型V3模型OCRModelConfig config null;//OCR参数OCRParameter oCRParameter new OCRParameter();oCRParameter.cpu_math_library_num_threads 6;//预…...

【Excel】【VBA】Reaction超限点筛选与散点图可视化

【Excel】【VBA】Reaction超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能&#xff1a; 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…...

京华春梦,守岁这方烟火人间

文章目录 准备篇温度公共交通人流情况年货采购 文化体验传统庙会博物馆与展览烟花灯会祈福仪式民俗集市现代氛围其他活动 美食盛宴传统美食与特色小吃传统老字号京城新宠特色小吃街多元美食街 准备篇 温度 北京春节期间气温较低&#xff0c;室外通常在零下几度到零上几度之间…...

学Python的人…

学Python的人… 一、Python能干什么&#xff1f; 1.爬虫&#xff1a;前几年&#xff0c;深度学习还没发展起来的时候&#xff0c;书店里Python就和爬虫挂钩&#xff0c;因为Python写爬虫确实方便。 2.数据分析&#xff1a;Python有各种的数据分析库可以方便使用&#xff0…...

WebSocket 和 Socket 的区别

一、协议层次和工作方式 1.1 &#xff09;Socket 1.1.1&#xff09;Socket位于传输层&#xff0c;通常使用TCP或UDP协议 1.1.2&#xff09;提供了一个通用的网络编程接口&#xff0c;允许应用程序通过它发送和接收数据 1.1.3&#xff09;一般需要手动管理连接&#xff0c;错…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)

重新创建WebApi项目&#xff0c;安装Microsoft.AspNetCore.Authentication.JwtBearer包&#xff0c;将之前JwtBearer测试项目中的初始化函数&#xff0c;jwt配置类、token生成类全部挪到项目中。   重新编写login函数&#xff0c;之前测试Cookie和Session认证时用的函数适合m…...

【SpringBoot】SpringBoot中分页插件(PageHelper)的使用

目录 1.分页概念 2.原生写法 3.PageHelper插件分页查询 3.1 介绍 3.2?使用 3.3 Page对象和PageInf对象 1.分页概念 用户查询的数据不可能一次性全部展示给用户&#xff08;如果用户有一万条数据呢&#xff09;&#xff0c;而是分页展示给用户&#xff0c;这就是分页查询…...

【优选算法】4----盛最多水的容器

开始有点上强度了铁子们&#xff0c;这道算法题也是可以说很难理解的~ 想了好久才想明白~ ---------------------------------------begin--------------------------------------- 题目解析&#xff1a; 这一道题刚看题目&#xff0c;根本不知道在讲啥&#xff0c;但看到体积…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

GeoServer发布PostgreSQL图层后WFS查询无主键字段

在使用 GeoServer&#xff08;版本 2.22.2&#xff09; 发布 PostgreSQL&#xff08;PostGIS&#xff09;中的表为地图服务时&#xff0c;常常会遇到一个小问题&#xff1a; WFS 查询中&#xff0c;主键字段&#xff08;如 id&#xff09;莫名其妙地消失了&#xff01; 即使你在…...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...