【老白学 Java】你能想到「封装」说明有点专业

news2024/12/22 15:58:23

你能想到「封装」说明有点专业

码老白
文章来源:《Head First Java》修炼感悟。

上一章,师兄们能否理解对象属性的相互关系? 本章老白想聊聊数据安全的问题,毕竟谁都不想把自己的数据暴露于大庭广众之下。 如果那样的话将毫无隐私可言,委实令人尴尬。 下面我们来了解一下什么是「封装」。

「封装」的意义

通过这段时间的修炼,相信大家都有了不小的进步,最起码打印输出的小程序应该信手拈来。 不过,老白不得不说些沮丧的话,这些代码结构很糟糕。 先前我们写的所有代码,如果仅是自己玩玩也就罢了,但如果用在正式场合,那就不得不考虑一下数据安全问题了。

试想,一个项目数以百计的类可以随意访问其它类的方法,随意修改其变量,整个程序就会面临崩溃的危险。 比如,你精心设计了一个宠物类,其中的 height 是一个很重要的实例变量。 如果你的代码可以远程访问,你无法阻止类似 cat.height = 0 这样的修改,这个程序还能正常运行吗?

同样的问题也可能出现在方法调用上。 本来一个方法仅用于当前类,如果不加控制的话所有无关的类都可以随意访问。 有些不怀好意的恶意调取方法,比如无限循环调用,那你的程序瞬间就会瘫痪。

认识到问题的严重性了吗? 现在需要寻求一种方法,把访问权限控制在合理范围,拒绝一切无关修改和访问。 万幸的是,Java 的设计者们早就想到了这个问题,提供了「封装」的技术手段。

合理保护私有数据

老白刚看到封装(Encapsulation) 这个单词时,第一个想法就是「把什么东西塞进箱子里,不轻易让人看到」,就好像邮寄快件。 事实也差不多,塞进「箱子」里的东西就是数据,别人是无权拆箱的。

「封装」并不是彻底断绝外界访问,可以通过创建公有的 GetterSetter 访问器来存取变量,由不安全访问改为受保护访问。 请看下面代码:

/**
 * 源文件:Cat.java
 * 类描述:演示 Getter、Setter 访问器如何实现「数据封装」
 */
public class Cat {
	// 声明实例变量并赋初始值
	private int height = 5;
	
	// Setter,设置高度值
	public void setHeight(int height) {
		if (height < 5) {
			return;
		}
		this.height = height;
	}
	
	// Getter,返回高度值
	public int getHeight() {
		return height;
	}
}

不要怀疑,现在正在做的事情就是「数据封装」。 可能你会说,这也没什么神秘的,就是两个方法。 的确如此,或许将来你有了更多 Java 经验之后会有更好的保护数据的方法,但目前这是我们能做到的最好的保护数据安全的手段。

上面代码有几点需要注意,老白解释一下:

  1. Cat 类的实例变量 height 的声明方式有点特别,使用了 private 这样的关键字修饰,表示该变量只能在 Cat 类中使用,属于「私有数据」,别的类无权访问,哪怕是它的子类也不行。
  2. Getter 和 Setter 访问器使用 public 关键字修饰,表示允许外部访问。
  3. 注意 Setter 中 return 的用法,只要 if 条件成立(即 height < 5),方法直接返回,不会执行下一条赋值语句 this.height = height;,杜绝了譬如 height = -100 这样的恶意赋值。

善于隐藏实现细节

从现在开始养成一个习惯,设计新类时考虑一下访问权限的问题。 比如类中某个方法如果只是在当前类中使用,那就没有必要声明为 public,而改为 private 更合适。 换句话说,你若是能把所有变量和方法都声明为「私有」的话,那是最安全的。 不过,这样做意义不大,以安全的方式「暴露数据」才是正确的选择。

可能大部分人都不希望自己程序的实现细节过度暴露,因为有经验的程序员会根据参数列表以及返回值,大致猜出实现过程,所以核心代码的「数据隐藏」尤为重要。

老白感悟: 「数据封装」的基本原则,就是把实例变量声明为私有的,通过公有的 Setter 和 Getter 实现存取数据。

即将被封装的对象

以下内容摘自《Head First Java》,希望可以帮助大家加深对「封装」的理解。

  • Head First
    封装有什么本事?
  • Object
    嗯,你有没有梦到过面对 500 名观众,突然发觉自己没有穿裤子?
  • Head First
    是有一次。 我梦到跟一群模特儿在后宫嬉戏,然后我的裤子… 呃,先不谈这个。 OK,所以你是说没有封装就像没穿裤子? 但是没有露一点出来会不会很不舒服?
  • Object
    不会吧,大哥? 不舒服? 很不舒服? 哈哈哈哈 ~~~~ 哈哈哈 ~~~~
  • Head First
    这有什么好笑的? 我是很认真的。
  • Object
    哇哈哈哈哈 ~~~~ (在地上滚来滚去) ~~~~ (泪) ~~~~ 哈哈哈 ~~~~
  • Head First
    快来人啊!叫救护车,快!
  • Object
    我没事了,~~~~ 哈 ~~~~ 啊 ~~~~ 快不行了 ~~~~ 好了,真的没事了,啊 ~~~~ (深呼吸)。
  • Head First
    好吧,请告诉我们封装可以怎样保护你的安全。
  • Object
    封装会对我的实例变量加上绝对领域,因此没有人能够恶搞我的实例变量。
  • Head First
    比如说?
  • Object
    用膝盖想也能知道。 大部分的实例变量值都有一个适当的范围,比如身高就不可能是负的、佛跳墙就不可能在 3 分钟之内做好的。
  • Head First
    我懂你的意思了。 那封装是如何设下保护罩的?
  • Object
    强迫其它程序一定得经过 Setter,如此 Setter 就能够检查参数并判断是否可以执行。Setter 也许可以退回不合理的值,或是抛出 Exception,或者自己进行取小数点的操作。 重点在于,你可以在 Setter 中执行任何操作,直接暴露的 public 实例变量就没有这个能耐。
  • Head First
    但我有看过有些 Setter 什么事情也么做,只是把值设给变量而已,这样不是只会增加执行的负担吗?
  • Object
    这对 Getter 也是一样的,好处是你事后可以改变想法却不需要改变其它部分的程序。 假如说所有人都使用到你的类和公有变量,万一有一天你发现这个变量需要检查,只要在 Getter 中改动代码而无需强迫所有人改动。 封装的优点就是能够让你三心二意却又不会伤害别人,直接存取变量的效率是不可企及的。

《 上一篇 对象的「行为」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chat2db调用ollama实现数据库的操作。

只试了mysql的调用。 其它的我也不用&#xff0c;本来想充钱算了。最后一看单位是美刀。就放弃了这分心。于是折腾了一下。 本地运行chat2db 及chat2db ui https://gitee.com/ooooinfo/Chat2DB clone 后运行起来 chat2db的java端&#xff0c;我现在搞不清这一个项目是有没有…

主机型入侵检测系统(HIDS)——Elkeid在Centos7的保姆级安装部署教程

一、HIDS简介 主机型入侵检测系统(Host-based Intrusion Detection System 简称:HIDS);HIDS作为主机的监视器和分析器,主要是专注于主机系统内部(监视系统全部或部分的动态的行为以及整个系统的状态)。 HIDS使用传统的C/S架构,只需要在监测端安装agent即可,且使用用户…

qt中ctrl+鼠标左键无法进入

现象&#xff1a;qt中ctrl鼠标左键无法跳转部分函数&#xff0c;例如能跳到textEdit->toPlainText().&#xff0c;但无法跳转到toUtf8();但编译没有问题 排查1&#xff1a;我发现是交叉编译链的问题&#xff0c;使用linux自带就可以进&#xff0c;用ATK-I.MX6U就部分不能进…

Android gradle下载失败后 解决方案

Android 导入gradle一直失败&#xff0c;更新gradle源即可 比如项目里默认的是 distributionUrlhttps\://services.gradle.org/distributions/gradle-7.3.3-bin.zip 用下面这个来替换distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip

基于Java Springboot餐厅点餐系统(加入商家版)

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL5.7…

开源项目推荐——OpenDroneMap无人机影像数据处理

实景三维作为GIS最火的课题&#xff0c;最近在想做一套自己的三维构建工具&#xff0c;考察了几个开源项目&#xff0c;把自己的搜索过程用csdn记录下来&#xff0c;希望也能帮助到各位同仁。 OpenDroneMap&#xff08;ODM&#xff09;是一个开源项目&#xff0c;旨在处理无人…

手动安装Ubuntu系统中的network-manager包(其它包同理)

自己手闲把系统中的network-manager包给删了&#xff0c;导致的结果就是Ubuntu系统彻底没有网络。结果再装network-manager时&#xff0c;没有网络根本装不了&#xff0c;网上的方法都试了也没用&#xff0c;然后就自己源码装&#xff0c;这篇文章就是记录一下怎么手动下载包然…

【C++】从零实现 C++ 自定义 list 容器:双向链表与迭代器深度解析

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 &#x1f4cc; 1. 引言&#x1f4cc; 2. 内容概要&#x1f4cc; 3. list 容…

Python Excel XLS或XLSX转PDF详解:七大实用转换设置

目录 使用工具 Python将Excel文件转换为PDF Python将Excel文件转换为带页码的PDF Python将Excel文件转换为特定页面尺寸的PDF Python将Excel文件转换为PDF并将内容适应到一页 Python将Excel文件转换为PDF/A Python将Excel文件中的工作表转换为单独的PDF Python将Excel工…

Centos 7 安装wget

Centos 7 安装wget 最小化安装Centos 7 的话需要上传wget rpm包之后再路径下安装一下。rpm包下载地址&#xff08;http://mirrors.163.com/centos/7/os/x86_64/Packages/&#xff09; 1、使用X-ftp 或者WinSCP等可以连接上传的软件都可以首先连接服务器&#xff0c;这里我用的…

LabVIEW 使用 Snippet

在 LabVIEW 中&#xff0c;Snippet&#xff08;代码片段&#xff09; 是一个非常有用的功能&#xff0c;它允许你将 一小段可重用的代码 保存为一个 图形化的代码片段&#xff0c;并能够在不同的 VI 中通过拖放来使用。 什么是 Snippet&#xff1f; Snippet 就是 LabVIEW 中的…

A3超级计算机虚拟机,为大型语言模型LLM和AIGC提供强大算力支持

热门大语言模型项目地址&#xff1a;www.suanjiayun.com/mirrorDetails?id66ac7d478099315577961758 近几个月来&#xff0c;我们目睹了大型语言模型&#xff08;LLMs&#xff09;和生成式人工智能强势闯入我们的视野&#xff0c;显然&#xff0c;这些模型在训练和运行时需要…

开源音乐分离器Audio Decomposition:可实现盲源音频分离,无需外部乐器分离库,从头开始制作。将音乐转换为五线谱的程序

今天给大家分析一个音频分解器&#xff0c;通过傅里叶变换和信封匹配分离音乐中的各个音符和乐器&#xff0c;实现音乐到乐谱的转换。将音乐开源分离为组成乐器。该方式是盲源分离&#xff0c;从头开始制作&#xff0c;无需外部乐器分离库。 相关链接 代码&#xff1a;https:…

35.3K+ Star!PhotoPrism:一款基于AI的开源照片管理工具

PhotoPrism 简介 PhotoPrism[1] 是一个为去中心化网络设计的AI照片应用,它利用最新技术自动标记和查找图片,实现自动图像分类与本地化部署,你可以在家中、私有服务器或云端运行它。 项目特点 主要特点 浏览所有照片和视频,无需担心RAW转换、重复项或视频格式。 使用强大的…

基于Spider异步爬虫框架+JS动态参数逆向+隧道代理+自定义中间件的猎聘招聘数据爬取

在本篇博客中&#xff0c;我们将介绍如何使用 Scrapy 框架结合 JS 逆向技术、代理服务器和自定义中间件&#xff0c;来爬取猎聘网站的招聘数据。猎聘是一个国内知名的招聘平台&#xff0c;提供了大量的企业招聘信息和职位信息。本项目的目标是抓取指定城市的招聘信息&#xff0…

计算机网络 (2)计算机网络的类别

计算机网络的类别繁多&#xff0c;根据不同的分类原则&#xff0c;可以得到各种不同类型的计算机网络。 一、按覆盖范围分类 局域网&#xff08;LAN&#xff09;&#xff1a; 定义&#xff1a;局域网是一种在小区域内使用的&#xff0c;由多台计算机组成的网络。覆盖范围&#…

超好用shell脚本NuShell mac安装

利用管道控制任意系统 Nu 可以在 Linux、macOS 和 Windows 上运行。一次学习&#xff0c;处处可用。 一切皆数据 Nu 管道使用结构化数据&#xff0c;你可以用同样的方式安全地选择&#xff0c;过滤和排序。停止解析字符串&#xff0c;开始解决问题。 强大的插件系统 具备强…

【C#设计模式(9)——组合模式(Component Pattern)】

前言 组合模型是将对象组合成树形结构以表示“整体-部分”的层次结构&#xff0c;使客户终端代码更加简洁和灵活。 代码 //目录抽象类 public abstract class Directory {protected string _name;public Directory(string name){_name name;}public abstract void Show(); } …

Ubuntu下Xshell连接腾讯云服务器

1.在腾讯云上买好服务器后&#xff0c;找到控制台&#xff0c;找到自己的服务器重置密码&#xff0c;默认用户名时ubuntu 2.在Xshell连接服务器 然后出现一个秘钥接受&#xff0c;直接接受就好了&#xff0c;然后就出现下面 然后就可以了 查看当前登录的用户 whoami 查看当前服…

初识算法 · 位运算(3)

目录 前言&#xff1a; 两整数之和 题目解析 算法原理 算法编写 只出现一次的数字II 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是位运算&#xff0c;通过两道题目讲解&#xff0c;一道是只出现一次的数字II&#xff0c;一道是两整数之和。 链接分别…