当前位置: 首页 > 知识库问答 >
问题:

java - 面向对象编程时候:推荐给所有属性都加getter/setter方法,然后设置属性为私有吗?

冯阳云
2024-08-12

我们知道面向对象设计项目的时候,特别是Java项目,属性一般有getter/setter方法,
但是有时候我们又是直接使用类实例的属性(直接点出)

请问下:
1、推荐给所有属性都加getter/setter方法,然后设置属性为私有吗?
2、什么场景对属性使用getter/setter,什么场景不对属性使用呢?

共有2个答案

颜镜
2024-08-12

通常,推荐将类的属性设置为私有(private),并提供相应的 getter/setter 方法 来访问和修改这些属性。这是面向对象编程中的封装(encapsulation)原则,它强调将对象的状态与其实现细节隐藏起来,只暴露必要的接口给外部.

不使用 getter/setter,直接访问属性的场景:
内部类或私有类:如果类的作用范围非常小(如仅在同一个文件中使用,或者是一个私有的嵌套类),并且你确定该类不会公开给外部使用,直接访问属性可以简化代码。

端木飞
2024-08-12

1. 推荐给所有属性都加getter/setter方法,然后设置属性为私有吗?

不总是推荐给所有属性都加getter/setter方法,并将属性设置为私有。

虽然这种做法在很多情况下是推荐的(尤其是在封装和隐藏内部实现细节方面),但过度使用getter/setter可能会降低代码的清晰度和简洁性,特别是在那些不需要额外逻辑(如验证、计算或懒加载)的简单属性上。

最佳实践

  • 对于需要额外逻辑的属性,如验证输入、计算值、触发事件等,应该使用getter/setter。
  • 对于简单的、不需要额外逻辑的属性,如果团队或项目规范允许,可以直接公开属性(但请注意,这可能会降低代码的封装性)。
  • 考虑使用记录类(Record Classes)(如果语言支持),如Java 14引入的Record,它提供了一种简洁的方式来创建不可变的类,其中所有字段都是私有的,并自动生成getter方法(但不提供setter方法,以保持不可变性)。

2. 什么场景对属性使用getter/setter,什么场景不对属性使用呢?

使用getter/setter的场景

  • 当需要在访问或修改属性时执行额外的逻辑,如验证输入值、记录更改、触发事件等。
  • 当需要控制对属性的访问级别,例如,你可能想公开一个属性的只读视图(仅使用getter),但不允许外部代码直接设置其值。
  • 在设计需要高封装性和可扩展性的系统中,即使当前没有额外逻辑,也可能选择添加getter/setter以便将来可能的扩展。

不使用getter/setter的场景

  • 当属性非常简单,且不需要任何额外的访问控制或逻辑时。
  • 在数据传输对象(DTOs)或简单的值对象中,这些对象通常只用于封装数据,不需要复杂的逻辑。
  • 使用记录类(如果语言支持)作为不可变数据的表示时,它们自然不包含setter方法。

总之,决定是否使用getter/setter取决于具体场景和需求。在保持代码清晰、简洁和可维护性的同时,平衡封装性和直接性是很重要的。

 类似资料:
  • 如何在Kotlin中创建一个具有私有getter(或只是没有)但具有公共setter的属性? 不能使用错误: 在我的例子中,原因是Java Interop:我希望我的Java代码能够调用,但不能调用。

  • 问题内容: 如何在JavaScript中模拟PHP风格的__get()和__set()魔术获取器/设置器?许多人说这目前是不可能的。我几乎可以肯定,这是有可能的,因为像nowjs(http://nowjs.com)这样的项目会做这样的事情。 我知道您可以利用get和set,但是当您不确定属性名称是什么时,这些将无法使用。例如, 如果您希望在创建新属性时执行事件处理程序,该 怎么办? 我想做的例子:

  • 嗨,我试图使用strut得到一个bean到我的jsp代码,我在我的jsp页面中使用的bean是:但是每当我运行jsp时,我就会收到 bean的“unitForm”的属性“testData.team.type”没有getter方法。 我正在尝试将棒球写入我的JSP页面。 我的行动表单的代码是: 测试数据类具有: 最后在我的体育课上:

  • 我不明白为什么我必须对类中的私有属性使用getter或setter。

  • 我声明了以下类,并声明了作为一个属性,该属性使用属性初始化decorators.however没有列出作为对象的属性,而是列出。这是如何工作的?

  • 问题内容: 长话短说:我需要使用PHP风格的getter,但要使用JavaScript。 我的JavaScript仅在Firefox中运行,因此我可以使用Mozilla特定的JS。 我能找到的制作JS吸气剂的唯一方法是指定其名称,但我想为所有可能的名称定义一个吸气剂。我不确定这是否可行,但我非常想知道。 问题答案: 可以做到!我很高兴这个存在!这里给出一个答案:是否有与python的__getat