为什么要使用 getter 和 setter/accessors? [英] Why use getters and setters/accessors?

查看:31
本文介绍了为什么要使用 getter 和 setter/accessors?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 getter 和 setter(仅获取和设置)而不是简单地为这些变量使用公共字段有什么好处?

What's the advantage of using getters and setters - that only get and set - instead of simply using public fields for those variables?

如果 getter 和 setter 所做的不仅仅是简单的 get/set,我可以很快弄清楚这一点,但我不是 100% 清楚如何:

If getters and setters are ever doing more than just the simple get/set, I can figure this one out very quickly, but I'm not 100% clear on how:

public String foo;

比:

private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }

而前者需要更少的样板代码.

Whereas the former takes a lot less boilerplate code.

推荐答案

实际上很多很好的理由考虑使用访问器而不是直接暴露类的字段 -不仅仅是封装和使未来的更改更容易的论点.

There are actually many good reasons to consider using accessors rather than directly exposing fields of a class - beyond just the argument of encapsulation and making future changes easier.

以下是我所知道的一些原因:

  • 封装与获取或设置属性相关的行为 - 这允许以后更轻松地添加其他功能(如验证).
  • 隐藏属性的内部表示,同时使用替代表示公开属性.
  • 使您的公共接口免受更改 - 允许公共接口在实现更改时保持不变,而不会影响现有使用者.
  • 控制属性的生命周期和内存管理(处置)语义 - 在非托管内存环境(如 C++ 或 Objective-C)中尤其重要.
  • 在运行时属性更改时提供调试拦截点 - 在某些语言中,如果没有此功能,则在何时何地调试属性更改为特定值可能会非常困难.
  • 改进了与旨在针对属性 getter/setter 操作的库的互操作性 - 想到了模拟、序列化和 WPF.
  • 允许继承者通过覆盖 getter/setter 方法来更改属性行为和公开方式的语义.
  • 允许将 getter/setter 作为 lambda 表达式而不是值传递.
  • getter 和 setter 可以允许不同的访问级别 - 例如 get 可能是公开的,但 set 可以受到保护.

这篇关于为什么要使用 getter 和 setter/accessors?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆