原文作者: Shamik Mitra

原文链接:https://dzone.com/articles/why-should-i-write-getters-and-setters

  当我开始我的java职业生涯的时候,我就对getters 和setters感到疑惑。有一个问题经常在我脑海里冒出来:为什我要写getters和seters。这种语法对我来说是很奇怪的。

  我知道如果用public来修饰的话,类中的变量可以被所有包(packages)访问到,getters/setters 方法也是这样。我也在做相同的事情——用private修饰变量,同时用public修饰其对应的getters 和setters方法,这样就可以在所有包中访问了。

  所以下面两种写法有什么不同呢?

public String name = "Shamik";
// caller:
String name = X.name; //(X is a object instance);
X.name = "Shamik Mitra";
private String name = "Shamik";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// caller:
String name = X.getname();
X.setName("Shamik Mitra");

 后来我慢慢意识到为什我们要使用getters/setters,还有为何他们如此重要。在这篇文章中,我会分享一些相关的感悟。

感悟

“用public修饰一个变量”和“通过getters/setters来操作这个变量”最主要的区别是在实质上保持变量的控制。如果你用public修饰一个变量,这以为着你可以直接访问到它,并且可以对这个变量做所有操作。例如,你可以把这个变量设为null,当你在其他方法中使用这个变量的时候,可能抛出空指针异常。

但是,如果你提供了getter/setter方法,这是一种间接的访问,它并不能完全地控制这个变量。为这个变量赋值的唯一方法就是通过setter方法,同样地只能通过getter方法来获取变量的值。所以现在你所定义的变量就只有一个“入口”和“出口”。并且,因为getter/setter是方法,这意味着里面可以写代码,你可以做校验去检查这些变量。因此,对象可以决定是否为这个变量赋值。当调用getter方法的时候,你可以决定返回一个真正的引用或者是复制它并返回。

所以 getters/setters 就像是保险丝或者是断路器。当发生什么错误的时候,保险丝就会从主电路中分离以保证电路是安全的。这里概念是一样的,如果有什么错误发生,setter可以不把值传过去。

当你看完这些解析之后,我知道你仍然有一个问题:

你说的我知道啊,但通常,我们都不在getters/setters方法里面写其他东西。我们只是返回和设这个变量。这和直接用pulic修饰变量,把它完全暴露出去一样。所以你说这些做什么?

对于这个问题,我说的是在写getters/setters的时候,我们创建了一个规制可以在以后加入任何的校验。现在里面是没有校验,但以后有什么问题的话,我们只需要在setter里面加入校验相关的代码就行了。

但对于这个问题现在仍然有很多争论,并且有很多人支持下面这个观点:YAGNI (You Ain't Gonna Need It——你根本就不需要它)。他们说,当这个变量没有必要去校验的时候,为什么还要这么麻烦去写getter/setter?我直接用public 把它公开得了。

按我的理解,YAGNI的主要问题是想要使代码避免不必要的复杂。这就像有些人会想得很多,他们使代码尽量地简单普通以便之后做任何修改。但大多数他们所考虑到的改变都不会来。

总结

getters/setters 不会使你的代码变得复制,并且是便于以后的校验。所以,尽管写吧。

译者注: getters/setters的概念出现已经很久了,对于有经验的程序员或许都有自己的理解。其实我们现在写getters/setters方法很多时候是受到框架的约束,无论是在数据端和前端都大量使用到javaBean,getters/setters是必不可少的。写起来也不麻烦,反正编译器可以直接生成。 但现在有写数据存储的框架已经开始舍弃getter和setter,甚至连成员变量也舍弃了,直接用一个map来保持变量名和其对应的值, 使代码变得非常的简洁。当然,这也有着明显的缺点。

【外文翻译】 为什么我要写 getters 和setters的更多相关文章

  1. 为什么要使用getters和setters/访问器?

    Why use getters and setters/accessors? 实际上会有很多人问这个问题....尤其是它成为Coding Style中一部分的时候. 文章出自LBushkin的回答 T ...

  2. JavaBean的getters和setters方法自动生成

    xgClass.java文件: public class XgClass { private String ccCityDerate1000Num; } 添加getter/setter方法: 在代码区 ...

  3. use getters and setters Learning PHP Design Patterns

    w Learning PHP Design Patterns Much of what passes as OOP misuses getters and setters, and making ac ...

  4. Mongoose 预定义模式修饰符 Getters 与 Setters 自定义修饰符

    mongoose 预定义模式修饰符 mongoose 提供的预定义模式修饰符,可以对我们增加的数据进行一些格式化,主要有:lowercase.uppercase .trim,这里不一一演示,对trim ...

  5. [REPRINT]Properties vs. Getters and Setters

    http://www.python-course.eu/python3_properties.php Our new class means breaking the interface. The a ...

  6. [翻译]如何用YII写出安全的WEB应用

    前言 虽然本文是基于YII1.1,但其中提到的安全措施适用于多数web项目安全场景,所以翻译此文,跟大家交流.原文地址. 目录 安全基本措施... 2 验证与过滤用户的输入信息... 2 原理... ...

  7. 【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch

    本文来自: https://fabxc.org/tsdb/, 如翻译有误,请纠正. 我是从事监控工作的.特别是Prometheus, 一个包含自定义的时间序列库以及集成Kuberntes的监控系统. ...

  8. 在EntityFramework6中管理DbContext的正确方式——1考虑的关键点(外文翻译)

    (译者注:使用EF开发应用程序的一个难点就在于对其DbContext的生命周期管理,你的管理策略是否能很好的支持上层服务 使用独立事务,使用嵌套事务,并行执行,异步执行等需求? Mehdi El Gu ...

  9. 在EntityFramework6中管理DbContext的正确方式——2DbContext的默认行为(外文翻译)

    (译者注:使用EF开发应用程序的一个难点就在于对其DbContext的生命周期管理,你的管理策略是否能很好的支持上层服务 使用独立事务,使用嵌套事务,并行执行,异步执行等需求? Mehdi El Gu ...

随机推荐

  1. JavaScript 图片轮播入门

    轮播要求:一个在页面居中的矩形框,图片依次从矩形框中经过 当图片完整占满矩形框时 停留一小段时间再向左边移动经过矩形框的图片自动跑到右边最后一个图的后面.核心原理:在一个for循环中利用offsetl ...

  2. HTTP协议&SOCKET协议

    一. HTTP协议是什么? 我们在浏览器的地址栏里输入的网站地址叫做 URL(UniformResourceLocator,统一资源定位符).就像每家每户都有一个门牌地址一样,每个网页也都有一个Int ...

  3. spring或springmvc自动生成applicationcontext.xml或springmvc文件(此文转载和借鉴多篇文章)

    在用spring或者springmvc框架进行开发时,编辑applicationcontext.xml等配置文件是必不可少的,在eclipse中打开applicationcontext.xml通常是这 ...

  4. idea 中设置成公司规范的代码格式

    优雅的编码格式是一个程序员的必备素质. 最近切换到了 idea,想对自己的代码进行格式化的时候希望能自动排版成公司规定的格式,可以做以下设置: 打开 idea 的 preference: 左侧找到 c ...

  5. appledoc导出iOS代码文档的使用和问题详解(干货篇)

    appledoc导出iOS代码文档的使用和问题详解(干货篇) 1. 简单说一下背景和自己感受 背景: 项目好像突然黄了,公司让详细写项目代码的注释并且导出文档,弄完之后就要封版. 说实话:听到这个消息 ...

  6. jsp中九大内置对象

    jsp实质是一个Servlet类,当jsp页面第一次被访问时,就会被服务器翻译成.java文件,紧接着就编译成.class文件. jsp<% %>和<%= %>脚本中可以直接使 ...

  7. Jmeter添加监控指标

    需要监控的机器上安装Server-Agency(需要java环境支持)把ServerAgent-2.2.1.zip拷到需要监控的机器上,解压Linux启动如下2. Jmeter上添加监控最终有如下指标 ...

  8. 【一通百通】C/C++的std标准总结

    C/C++发展很多版本标准,sunsky(本人)早就想理理std标准了,让大家有个清晰的了解. 适用C(或C源代码,如C ++,Objective-C和Objective-C ++)的标准: -ans ...

  9. 【Flex】编辑器的缩放功能(绝对定位和相对定位)

    一.横向的ide拖动缩放效果 <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplic ...

  10. 判断是否是IE(包含IE11)

    判断是否是IE(包含IE11) if(!!window["ActiveXObject"] || "ActiveXObject" in window) { ale ...