setter 和 getter 方法是否会破坏封装? [关闭]

2023-11-25

有人告诉我们应该避免 setter 和 getter。关于它有各种各样的想法,但根据我的说法,使用这些会破坏封装。为什么?因为它告诉世界一个物体的内部结构。例如:

class Point {
  private int x;
  private int y;

  void setx(int x) {...}
  int getx() {...}
  ... 
}

该对象应该只公开行为,为客户端提供清晰的抽象。

class Point {
  private int x;
  private int y;

  int coordinate(int x) {...} // 0, 1, 2, 3
  ... 
}

那么,这些访问器和设置器方法是否破坏了封装?


From here:

拥有 getter 和 setter 本身并不会破坏封装。 破坏封装的是拥有 getter 和 setter 每个数据成员(Java 术语中的每个字段)。那就是一步之遥 公开所有数据成员。

封装的重点不是你不应该知道 或者从对象外部更改对象的状态,但是您 应该有一个合理的政策来做到这一点。

考虑一个 Person 类的例子。假设一个人有一个名字, 社会安全号码和年龄。假设我们不允许 人们永远改变他们的名字或社会安全号码。然而, 该人的年龄每年应增加 1。在这种情况下, 您将提供一个构造函数来初始化名称和 SSN 为给定值,这会将年龄初始化为 0。您 还将提供一个方法incrementAge(),这会增加 年龄增加 1。您还可以为这三个对象提供吸气剂。没有二传手 在这种情况下需要。

在此设计中,您允许检查对象的状态 在类之外,并且您允许从外部更改它 班级。但是,您不允许任意更改状态。 有一项政策有效规定姓名和 SSN 根本无法改变,年龄可以加1 一次一年。

现在假设一个人也有工资。人们可以换工作 随意,这意味着他们的工资也会改变。为了模拟这个 这种情况我们没有办法,只能提供一个setSalary()方法! 允许工资随意变动是完全合理的 在这种情况下的政策。

顺便说一下,在你的例子中,我会给冰箱班 putCheese() 和 takeCheese() 方法,而不是 get_cheese() 和 set_cheese()。那么你仍然会有封装。

您还可以参考:为什么 getter 和 setter 方法是邪恶的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

setter 和 getter 方法是否会破坏封装? [关闭] 的相关文章

  • 从文本文件中读取阿拉伯字符

    我完成了一个项目 在该项目中我读取了用记事本编写的文本文件 我的文本文件中的字符是阿拉伯语 文件编码类型是UTF 8 当在 Netbeans 7 0 1 中启动我的项目时 一切似乎都正常 但是当我将项目构建为 jar 文件时 字符以这种方式
  • 将构造函数作为参数传递给方法

    我是java新手 开始研究构造函数 我看到一些构造函数作为参数传递给方法的示例 请告诉我当构造函数作为参数传递给方法时会发生什么 或者建议我一些链接 我可以在其中获得有关使用构造函数的足够知识 根据您需要传递构造函数的目的 您可以考虑传递供
  • 对象数组的数组(二维数组)JNI

    我正在努力创建自定义对象类型 ShareStruct 的二维数组 jobjectArray ret jobjectArray ins jobjectArray outs jclass myClass env gt FindClass env
  • 本地开发的 Azure Functions 扩展包版本问题

    我有一个带有队列触发器的 Java 11 Azure 函数 该函数在部署到 Azure 时按预期工作 并正确从定义的服务总线主题中提取消息 但是 运行相同的功能locally除非我回滚版本 否则不起作用Azure Functions 绑定扩
  • 我需要在 JFileChooser(打开模式)中显示不带扩展名的文件名。如何?

    我在打开模式下使用 JFileChooser 我需要显示不带扩展名的 文件名 字段 如何 我知道文件视图 它删除文件系统文件中的扩展名 但将所选文件中的扩展名保留在 文件名 字段中解释 http saveimg ru show image
  • JavaFX使节点覆盖父节点边框颜色

    我有一个如下所示的节点 仅使用 css 我希望标签覆盖其父边框颜色 因此标签下方的边框颜色部分变得不可见 我用来制作这个边框的CSS代码 fx border color black fx border width 3 fx border r
  • 可访问数据的 Java 约定。 (公共访问器和 Getter/命名)

    通过 Java API 您会看到大量冲突的命名和实践 这让我感到非常困惑 例如 The String http grepcode com file repository grepcode com java root jdk openjdk
  • 在grails控制器中识别ajax请求或浏览器请求

    我正在开发一个使用大量ajax的grails应用程序 如果请求是ajax调用 那么它应该给出响应 这部分正在工作 但是如果我在浏览器中输入URL 它应该带我到主页 索引页面而不是请求的页面 下面是ajax调用的示例gsp代码
  • 具有 JPA 持久性的 Spring 状态机 - 存储库使用

    我试图弄清楚如何轻松使用 Spring 状态机 包括使用 JPA 进行持久化 这是我正在处理的问题 不兼容的数据类型 工厂和持久性 在程序的某个时刻 我想使用连接到用户的状态机 有用于此目的的存储库 项目spring statemachin
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • 纱线上的火花,连接到资源管理器 /0.0.0.0:8032

    我正在我的开发机器 Mac 上编写 Spark 程序 hadoop的版本是2 6 spark的版本是1 6 2 hadoop集群有3个节点 当然都在linux机器上 我在idea IDE中以spark独立模式运行spark程序 它运行成功
  • 拆分/标记化/扫描字符串并注意引号

    Java中是否有默认 简单的方法来分割字符串 但要注意引号或其他符号 例如 给定以下文本 There s a man that live next door in my neighborhood and he gets me down Ob
  • 为什么无法从 WEB-INF 文件夹内加载 POSModel 文件?

    我在我的 Web 项目中使用 Spring MVC 我将模型文件放在 WEB INF 目录中 String taggerModelPath WEB INF lib en pos maxent bin String chunkerModelP
  • 如何在不反编译的情况下更改已编译的.class文件?

    我想更改 class 文件方法 我安装 JD Eclipse Decompiler 并打开 class 文件 我添加了一些代码并保存 class 文件 但是 class 文件没有改变 我不知道如何使用反编译器 如果可能的话 如何在不使用反编
  • Java 中 JButton 的击键/热键

    最初我使用 JMenu 并建立热键以使用加速器工作 它运行得很好 现在我想在 JButton 中实现相同的行为 但我陷入困境 这是我编写的代码 请分享您的想法 以便我可以走上正确的道路 import javax swing import j
  • HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST [重复]

    这个问题在这里已经有答案了 我无法使页面正常工作 我有要发布的表单方法和我的 servlet 实现doPost 然而 它不断地向我表明我并不支持POST方法 我只是想做一个简单的网站并将值插入到我的 MySQL 数据库中 type Stat
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 使用 PC/SC 读卡器验证 Ultralight EV1

    我在尝试使用 Java 中的 PC SC 读卡器 特别是 ACR1222L 验证 Ultralight EV1 卡时遇到问题 我能够使用 ISO 14443 3 标签的相应 APDU 在不受保护的标签上进行写入和读取 但是 我找不到运行 P
  • java.lang.IllegalStateException - 提交响应后无法创建会话

    我在我的项目中使用 JSF PrimeFaces 我为此准备了一个Maven项目 当我编译项目并加载主页后 我收到以下异常 java lang IllegalStateException Cannot create a session af

随机推荐

  • 如何使用 TryParseHtmlString 将十六进制转换为颜色(RGBA)

    如何使用十六进制值更改 Unity 中的按钮颜色 我尝试了这个 但它不起作用 也许我在这里犯了一个错误 btn image color ColorUtility TryParseHtmlString DADADAFF out color 您
  • 如何通过 PHP 获取页面正文中的 URL 参数?

    在 Drupal 站点上 为页面正文内容启用了 PHP 代码 如何在 PHP 代码中获取参数及其值 例如 我想得到ref and 33002 from http example com node 1 ref 33002 在下面的代码中 我可
  • RPres 中的代码框大小和字体大小

    我过去经常使用 knitr 和 beamer 来制作幻灯片 我现在在 R 演示文稿中注意到一件事 代码框和代码字体大小的动态大小似乎都丢失了 使用 knit beamer 我可以轻松地使用 size 参数更改字体大小 例如 size foo
  • 如何将单个反斜杠放入 ES6 模板文字输出中?

    我正在努力获取 ES6 模板文字来生成单个反斜杠及其结果 gt s s gt s s gt s s gt s s gt u005Cs s 通过检查 Node REPL 上的值 而不是使用打印它 使用 Node 8 9 1 和 10 0 0
  • ios:如何使用 StoryBoards 从 ViewController 打开选项卡栏控制器

    我正在这样做 并且想要从登录页面打开选项卡栏控制器 如果是第一次并且已经登录 然后传递登录页面并在 Spalsh 之后打开选项卡栏控制器 意味着如果用户第一次登陆应用程序 时间顺序应该是这样的 1 飞溅 2 登录页面 3 成功登录后 打开具
  • django forms:在单个表单中编辑多组相关对象

    我正在尝试做一些应该很常见的事情 以单一形式添加 编辑一堆相关模型 例如 Visitor Details Select destinations and activities Miami swimming clubbing sunbathi
  • Url 编码和 HTML 编码之间的区别

    和有什么区别网址编码 and a HTML 编码 HTML 编码对 HTML 文档中使用的字符串中的特殊字符进行转义 以防止与 HTML 元素混淆 例如更改
  • Python 异步任务排序

    我有一个关于python中的事件循环如何的问题asyncio模块管理未完成的任务 考虑以下代码 import asyncio asyncio coroutine def a for i in range 0 3 print a str i
  • JavaFX 中的 HTML 编辑选项

    我希望将基于 Swing 的应用程序中使用的 HTML 编辑器替换为基于 JavaFX 的编辑器 据我所知 有两种可能的选择 1 使用JavaFX HTML 编辑器 虽然这对于功能来说非常好does有 它仍然缺乏其他几个功能 例如插入图像
  • 移动应用程序的 OAuth2 流程

    我们有一个预先存在的移动应用程序 用户将注册他的用户名和密码 目前我们有一个基于自定义令牌的身份验证 我们希望在不影响用户体验的情况下切换到 OAuth2 看起来资源所有者密码凭证对我们来说是最接近的流程 但是有很多建议反对使用它们 任何其
  • 使用斯坦福 NLP 检测语言

    我想知道是否可以使用Stanford CoreNLP检测句子是用哪种语言写的 如果是这样 这些算法的精确度如何 几乎可以肯定的是 斯坦福 COreNLP 目前还没有语言识别功能 几乎 因为不存在更难证明 编辑 尽管如此 以下是间接证据 也没
  • If 语句与函数指针

    目标是根据复选框是否打开或关闭来更改事件循环中的行为 我能想到的最简单的方法就是每次运行循环时测试复选框状态 if statement void action void someLoop if checkboxTrue action oth
  • AngularJS $http 从失败的 CORS 请求返回状态代码 0

    好吧 我已经查遍了这个 基本上我们使用的是跨域请求的 http 请求 我们的服务器允许该域 当请求返回 200 时 一切正常 然而 每当我们的服务器返回错误 500 401 无论什么时候 Angular 都会认为这是 CORS 问题 我使用
  • 客户端和服务器端编程有什么区别?

    我有这个代码 为什么这不会将 bar 写入我的文本文件 而是警告 42 注意 这个问题的早期修订明确涉及服务器上的 PHP 和客户端上的 JavaScript 问题的本质和解决方案是相同的any当一种语言在客户端上运行而另一种语言在服务器上
  • 访问修饰符 - 目的是什么?

    一般来说 我对编程比较陌生 我想知道是否有人可以帮助我理解访问修饰符的目的 我知道他们为类和变量等设置了不同的访问级别 但为什么要限制对这些内容的访问权限 不允许访问不同的东西有什么意义 为什么不只允许访问所有内容呢 抱歉 如果这是一个愚蠢
  • 未使用的装配参考的成本是多少?

    我想知道在 NET 解决方案中引用程序集的各种成本是多少 我对技术和组织成本都感兴趣 一些例子 未使用的程序集包含需要传送的额外字节 下载时间更长 浪费空间 未使用的程序集可能包含可利用的安全漏洞 未使用的程序集可能会产生额外的启动成本 未
  • 使用 Selenium 和 Python 查找存在 data-tb-test-id 属性而不是 id 的元素

    我正在尝试使用 Selenium 查找元素 但没有找到 请遵循 HTML 代码 div style font size 12px font weight normal color 000000 display inline block pa
  • 如何使 D3 强制布局中的标签和节点可单击以导航到 URL?

    我正在使用 D3 使用基于力的布局 并且想知道当我单击节点或标签时是否可能会自动转到存储在该节点 标签中的 url 如果是的话 我怎样才能实现这一目标 这就是图表的实际外观 标签指示 URL 本身 我正在分享我用来生成 D3 图的 Java
  • 使用 CSS 子选择器会更快吗?

    如果我们想定位段落内的链接 哪个选择器会更有效 更快 p a or p gt a 第二个 极其 稍微快一些 CSS 由浏览器反向处理 因此您的两个规则都会在所有a页面上的元素 对于第二条规则 它只需要测试直接父级 对于另一条规则 它需要测试
  • setter 和 getter 方法是否会破坏封装? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 有人告诉我们应该避免 setter 和 getter 关于它有各种各样的想法 但根据我的说法 使用这些会破坏封装 为什么 因为它告诉世界一个物体的内部结构 例如 class Point p