当前位置: 首页 > 面试题库 >

当我们有访问器和更改器时,为什么要声明私有字段?

云宾鸿
2023-03-14
问题内容

如果我用Java创建一个类,就会一直被告知惯例是将类的所有字段都设为私有。如果需要访问或更改它们,可以创建访问器和更改器方法。我确实了解私有变量的重要性,因为它们有助于降低复杂性并允许封装。

我不明白的是,如果我创建一个公共的accesor和mutator方法,那么变量不是公共的吗?在任何人都可以访问私有变量的情况下,为什么仍然习惯使用私有变量?

我还应该指出,我了解这些方法的重要性,但是我想知道为什么 即使 我们允许任何人通过这些方法访问它,我们 也还是 要费心将该变量设为私有?


问题答案:

是的,您是对的,它确实有效地使变量公开。但是有一个重要的区别,那就是它使您能够在以后进行更改:可以随意删除setter或将其设为私有,而不会影响使用getter从字段读取的代码。

如果只是将变量设为公开,则在不中断对该字段的读取的情况下就无法停止对该字段的写入。

它还有其他优点。例如,您可以synchronized稍后进行访问,而不会破坏客户端代码。简而言之,它允许以后进行大量修改,否则这些修改就不会在使用该类的代码中造成大量损坏的情况下发生。

您还可以添加额外的逻辑,以便在有人写入字段或阻止某些线程写入等内容时记录日志…… 如果您的getter 将字段的类型抽象HashMap为a
TreeMap并返回a,则可以将字段的类型从a更改为a Map。 ..等



 类似资料:
  • 然后用Gson lib将响应转换为我们需要的对象。 这来自Square/OKHTTP文档: 它的请求/响应API是用流畅的构建器和不变性设计的。它同时支持同步阻塞调用和带有回调的异步调用

  • 问题内容: 我们在Java中有包装器类,例如Interger,Float ..为什么它仍然仍然支持原语,这使Java成为完全面向对象的语言? 问题答案: 包装器是对象,被放置在堆中。基元只是“值”,并进入堆栈。这是更有效的,因为对于堆中的已包装基元,您(至少)需要值(位于堆栈中) 和 对包装器对象的引用。 这种性能提升是否重要根本取决于您在做什么。当然,对于繁重的数字工作而言,但对于其中99%的工

  • 约书亚·布洛赫在高效的Java中写道: 请注意,非零长度数组总是可变的,因此类具有公共静态最终数组字段或返回此类字段的访问器是错误的。如果类具有这样的字段或访问器,客户端将能够修改数组的内容。这是安全漏洞的常见来源: 请注意,许多IDE生成的访问器会返回对私有数组字段的引用,这恰恰导致了这个问题。有两种方法可以解决这个问题。您可以将公共数组设为私有,并添加公共不可变列表: 或者,可以将数组设为私有

  • 问题内容: 为什么编译器没有在开关中的每个代码块之后自动放置break语句?是出于历史原因吗?您何时要执行多个代码块? 问题答案: 有时将多个案例与同一代码块关联会很有帮助,例如 等。只是一个例子。 以我的经验,通常“摔倒”并在一种情况下执行多个代码块是不好的风格,但是在某些情况下可能会有用处。

  • AWS VPC配置有4种场景。但让我们看看这两个: 场景1:1个公共子网。 场景2:1个公共子网和1个私有子网。 由于在公有子网中启动的任何实例都没有 EIP (除非已分配),因此它已无法从 Internet 寻址。然后: 为什么需要私有子网? 私有子网和公共子网到底有什么区别?

  • 问题内容: 在大学里学习时,我不得不做一些难看的Java基础知识,例如不使用封装就可以工作,同一类中的主要方法等。(我不想在Java样式指南上展开讨论,我只是想澄清一下,我不会在大学以外写这样的东西) 我偶然发现了一种我无法向自己解释的行为: 为什么这段代码可以编译并正确运行?我怎么可能访问私有字段?由于主类位于同一类中,因此行为异常? 问题答案: 由于静态方法是类的成员,因此可以访问中的任何私有