如何避免 getter 和 setter

2024-03-01

我在很多地方读到过“getter 和 setter 是邪恶的”。我明白为什么会这样。但我不知道如何完全避免它们。 Say Item 是一个包含有关商品名称、数量、价格等信息的类... ItemList 是一个类,它有一个项目列表。要查找总计:



int grandTotal()
{
int total = 0;

for (Item item: itemList)
       total += item.getPrice();

return total;
}
  

在上述情况下,如何避免 getPrice() 呢? Item类提供了getName、setName等......

我该如何避免它们?


什么时候应该使用 getter 和 setter?

getter 和 setter 非常适合配置或确定类的配置,或者从模型中检索数据

获取商品的价格是 getter 的完全合理的使用。这是需要可用的数据,并且可能涉及通过向设置器添加验证或清理来保护数据的特殊考虑。

您还可以提供 getter 而不提供 setter。他们不have to成对出现。

什么时候不应该使用 getter 和 setter?

有时,对象依赖于永远不会公开的内部属性。例如,迭代器和内部集合。暴露内部收藏可能会产生巨大的负面和意想不到的后果。

另外,例如,假设您正在通过某个 HttpURLConnection 进行通信。公开 HttpURLConnection 的 setter 意味着如果在等待接收数据时连接发生更改,您最终可能会遇到非常奇怪的状态。该连接应该在实例化时创建或完全在内部管理。

Summary

如果您拥有出于所有意图和目的而公开的数据,但需要进行管理:请使用 getter 和 setter。

如果您有需要检索的数据,但在任何情况下都不应更改:使用 getter 而不是 setter。

如果您有需要为内部目的设置的数据,并且永远不应该公开暴露(并且不能在实例化时设置):使用setter而不是getter(setter大概可以防止影响内部属性的第二次调用)

如果您有一些完全内部的东西,并且没有其他类需要访问它或直接更改它,那么就不要使用它们。

不要忘记 setter 和 getter 可以是私有的,甚至对于内部管理的属性来说,拥有一个管理属性的 setter 可能是可取的。例如,获取连接字符串并将其传递给 HttpURLConnection 的 setter。

另请注意:

艾伦·霍鲁布的文章为什么 getter 和 setter 方法是邪恶的 http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html似乎是OP推理的来源,但在我看来,这篇文章在解释其观点方面做得很差。

编辑:添加摘要
编辑2:拼写更正

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

如何避免 getter 和 setter 的相关文章

  • 何时使用属性而不是函数

    这可能是个人喜好的问题 但是什么时候在代码中使用属性而不是函数 例如 要获取错误日志 我可以说 string GetErrorLog return m ErrorLog 或者我可以 string ErrorLog get return m
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • OOP 中的静态和动态变量/方法是什么?

    我试图更好地理解 OOP 中的基本概念 面向对象编程中的静态和动态变量和方法是什么 例如 使用 this 与使用双冒号 之间有什么区别 this this gt a method 优点 缺点 这个 不是自我记录的 如下所示 this gt
  • 在关系数据库中存储树结构的已知方法有哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 这是依赖注入吗?这是一种不好的做法吗?

    我有一个小框架 我是这样编码的 我不确定这是否称为依赖注入 我不知道它是否像设计模式 我也不知道并且想知道是否通过 this因为 param 是一种不好的做法 看看这个 不是一个有效的示例 只是将这些代码写入浏览器中以供解释 This is
  • 使用 jQuery 更改 CSS 类属性

    有没有办法使用 jQuery 更改 CSS 类的属性 而不是元素属性 这是一个实际的例子 我有一个 div 类red red background red 我想转班级red背景属性 而不是具有类的元素red分配的背景 如果我用 jQuery
  • 如何让 C# 设计器编辑我的结构属性?

    我正在使用 C 创建一个具有多个自定义属性的自定义 Windows 窗体控件 这些属性之一是一个带有几个整数字段的简单结构 public struct Test public int A B Test Test Category MyCat
  • 将父控件的属性传递给子控件

    我正在为特定应用程序开发一组自定义控件 我想定义对于外观目的的控件集通用的属性 为了论证 让我们这样做CustomCtrl AccentColor 我想为我的 Windows 窗体定义相同的属性 即Form1 AccentColor当我更改
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr
  • 使用 NSError 检查错误的正确结构

    我正在编写各种例程 并尽力保持其整洁和重构 我正在创建的方法开始看起来与此代码类似 IBAction buttonPress id sender Create Document Shopping List with this documen
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 在 dart 中使用括号表示法访问对象的属性

    我尝试执行以下操作 var properties height width for var prop in properties div style prop otherdiv style prop 但是 dart 似乎不接受这种括号表示法
  • 如何决定使用 IS A 还是 HAS A Relation

    public class B public String getMe return Some 假设我有一个上面的类 我们应该通过哪些参数来决定使用什么 是否是一个或有一个关系 HAS A public class A public stat
  • 为什么需要在 Python 方法中显式使用“self”参数? [复制]

    这个问题在这里已经有答案了 当在 Python 中的类上定义方法时 它看起来像这样 class MyClass object def init self x y self x x self y y 但在其他一些语言中 例如 C 您可以使用

随机推荐

  • TortoiseSVN 无法打开 ra_local 会话到 URL win XP

    我试图在 Windows XP 机器上通过 svnTortoise 使用 svn 只有我 只是想在家里做这件事 我在我的笔记本电脑上安装了乌龟 一切都很好 然后我来到我的桌面并安装了svnTortoise并尝试了它 但这次我得到了这些错误
  • 在 RabbitMQ 主题交换中路由与模式不匹配的消息

    两个队列绑定到具有以下路由键的主题交换 队列 A 与路由键模式匹配绑定 foo队列 B 与路由键模式匹配绑定 bar 我想向此交换添加第三个队列 该队列接收的消息都不是foo消息也不bar消息 如果我用一个绑定这个队列 路由密钥 我自然会得
  • Airflow - 跳过未来的任务实例而不更改 dag 文件

    我有一个 DAG abc 计划在每天上午 7 点 美国中部标准时间 运行 并且该 DAG 中有任务 xyz 由于某种原因 我不想为明天的实例运行任务 xyz 之一 如何跳过该特定任务实例 我不想对代码进行任何更改 因为我无权访问 Prod
  • 未加载用于在 Visual Studio 2012 中调试自定义项目的符号文件

    我在 Visual Studio 2012 中有一个大型解决方案 其中包含可执行文件和类库项目 调试应用程序时 不会命中某一特定类库项目中的断点 我看了看调试 gt 窗口 gt 模块窗口检查该项目的符号状态 它说 找不到或打开 PDB 文件
  • 我是否需要对使用 NewIntArray 创建的数组调用 ReleaseIntArrayElements?

    我有一个本机方法可以对位图进行一些工作 在该方法内部 我通过方法调用获取图像数据 该方法调用将数据写入jintArray我用它创建的参数NewIntArray jintArray pixels env gt NewIntArray widt
  • Grafana 条形宽度太小

    我想知道如何在直方图中获得更大的条形宽度 例如条形图 This is the graph how it looks rigth now And this is the corresponding query in flux 在 Grafan
  • Ninject.Web.PageBase 仍然导致对注入依赖项的空引用

    我有一个使用 Ninject 2 0 的 ASP NET 3 5 WebForms 应用程序 但是 尝试使用 Ninject Web 扩展来提供对 System Web UI Page 的注入 即使我切换到使用服务定位器来提供引用 使用 N
  • H2索引名称唯一性

    我对 h2 数据库中索引名称的唯一性有一个小问题 使用 mysql mariadb 可以同时为表 A 和表 B 定义名为 X 的索引 对于 h2 数据库这是不可能的 因为每个数据库的索引名称应该是唯一的 这对我来说是一个问题 因为我有一个基
  • 如何安排本地 Azure DevOps 构建每 5 分钟运行一次?

    不用管理由 我有一个案例 需要每 5 分钟运行一次构建 本地安装不支持 YAML 中的计划 那么 我们该怎么做呢 我可能可以使用 REST Api 但这很糟糕 因为我似乎要么创建一个一次性脚本 要么创建一个用于非常简单类型的计划的脚本 似乎
  • 丢包纠错码 (UDP)

    我不知道要寻找什么 因为我从 纠错代码 中得到的只是与您不知道错误位置的情况相关的内容 因此 这些代码比我需要的要复杂得多 而且效率低下 在下文中 请注意位等于数据包 因为只有整个数据包可能会丢失 因此位类比非常适合 是否有 ECC 考虑到
  • 授予某个数据库中所有存储过程的执行权限

    正如标题所示 我需要授予数据库中每个存储过程的执行权限 我们已经从测试转向生产 对生产数据库的控制减少了 并且所有导入的存储过程现在都获得了零权限 一件有趣的事情是 是否有任何方法可以确保所有导入的存储过程从一开始就获得执行权限 谢谢你的帮
  • 如何计算两个日期之间的天数?

    例如 输入框中给出两个日期
  • pip 安装 PIL 失败

    我正在尝试安装 pip 包 PIL 但是安装不起作用并抛出以下错误 Could not find a version that satisfies the requirement pil from xhtml2pdf 0 0 4 gt r
  • 我们可以在单独的模块中使用 Flask 错误处理程序吗

    我们正在将 Flask 应用程序从基于函数的视图迁移到可插入视图 除了错误处理程序之外 一切都按预期工作 我试图将所有错误处理程序放入一个名为 error handlers py 的模块中 并将其导入到主模块中 但它不起作用 尝试在 Goo
  • 如何同步两个 Oracle 数据库?

    我想创建一个项目 其中需要将本地数据库与远程数据库同步 本地数据库中所做的更改必须反映到远程数据库 这必须同步完成 我有一个应用程序 它对用 java jpa 编写的本地数据库执行 CRUD 操作 同步应该由 java 代码触发 我想到了数
  • 宽度等于动态高度平方[重复]

    这个问题在这里已经有答案了 当高度为父级 div 的 时 是否可以使用 css 或 js 将元素的宽度设置为与其高度相匹配 如果调整浏览器窗口的大小 子 div 也需要更改大小 Example body html height 100 pa
  • 元数据集合中已存在标识为“Id”的项目。参数名称:项目

    我的所有实体都有一个基类 public class Entity
  • 使用 Django 创建可编辑的 HTML 表格

    我正在尝试创建一个 Django 应用程序 用户可以在其中创建电影列表 每次用户登录时 他们的电影列表都会以表格形式呈现给他们 该表将包含三列 一列用于电影名称 一列用于类型 另一列包含删除按钮 允许用户删除与该按钮对应的行 用户可以通过在
  • Tensorflow 2.1.0 错误,模块“tensorflow”没有属性“GraphKeys”

    我今天刚刚安装了新的 tf 和 cuda 但是当我运行之前与 tf 1 4 一起使用的代码时 在新的 tensorflow 2 1 0 和 cuda 10 1 下将无法工作 如何解决这个问题 为了社区的利益 在答案部分提及解决方案 即使它出
  • 如何避免 getter 和 setter

    我在很多地方读到过 getter 和 setter 是邪恶的 我明白为什么会这样 但我不知道如何完全避免它们 Say Item 是一个包含有关商品名称 数量 价格等信息的类 ItemList 是一个类 它有一个项目列表 要查找总计 int