原文作者: 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. sass 学习

    本来看了阮一峰和于江水两位老师的博客,有看了ionic自带的sass文件,原以为自己已经是很熟悉,精通了.可是我居然连ruby都不知道真实惭愧啊,辛亏看了www.sass.hk  我想这篇官方文档肯定 ...

  2. Build your own linino system 编译你自己的linino系统

    懒癌犯了,先简单写过程,之后有时间再补上每一步的理由吧.对着来一遍,有bug请留言,我会尝试回答.(づ ̄ 3 ̄)づ ------------------------------------------ ...

  3. X-Scan使用教程

    下载X-Scan扫描器,解压缩,双击Xscan_gui.exe即可运行,不需要安装.X-Scan采用多线程的方式,对指定主机或者网段进行扫描. 其扫描功能(插件)有: 开放服务:扫描TCP端口状态,根 ...

  4. JVM中堆内存和栈内存的区别

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  5. Failed to connect to Xilinx hw_server. Check if the hw_server is running and correct TCP port is used.

    Failed to connect to Xilinx hw_server. Check if the  hw_server is running and correct TCP port is us ...

  6. python应用部署--flask

    首先必须吐槽一下,python应用部署简直就是有毒...太麻烦了.关键还不能成功部署. 网上很多教程都是说要用nginx和uwsgi.来来回回试了无数次都不行.于是乎,在某一个瞬间,灵感以来,发现了一 ...

  7. python中input()与raw_input()的区别到底是啥?-----marsggbo原创作品为你解答

    首先先给出总结:input () = int(raw_input()) 有图有真相!!! 先看看input的例子: 可见用input键入得到int类型的数据,那如果输入一些非int类型的会怎么样呢? ...

  8. java中的基本jdbc中mvc基本示例

    数据库: 包文件: Student.java 1 package com.model; 2 3 public class Student { 4 private int id; 5 private S ...

  9. Linux 搭建svn版本库

    一.安装svn服务器端yum install subversion      从镜像下载安装svn服务器端 如果后面执行“svnadmin create /usr/local/svn/sunny”提示 ...

  10. 微信小程序评分功能

    很多做过电商项目的朋友会经常用到评分的功能,我这里正好写了一个例子,发出来分享一下: 我写的是5分满分制的,首先,准备3个图片, ,像这样的,分别代表分数为0,0.5,1 时的状态, 效果图:(以3. ...