java - 当你不向任何人暴露任何东西时,你真的需要封装吗?
问题描述
请在推荐我发布此类帖子之前阅读,我在问一个非常具体的案例:
为什么要使用 getter 和 setter/accessor?
当我能够使用 setter 方法更改属性值时,封装有什么用?
让我们以一个 JAVA JEE 应用程序为例,它们基本上是网站。您的银行网站可能是一个 JAVA JEE 应用程序。
在这些方面,我们通常是一个由 10-15 名开发人员组成的团队,除了我们之外没有人使用我们的代码,没有人导入我们的包并使用我们的对象。
后端通常有 DAO 来访问数据库和 Value 对象以将数据传输到表示层。
VO 是实体的完美副本,例如:
公共类 UserVo {
private String name;
private String email;
private String password;
public UserVo(String name, String email, String password) {
this.name = name;
this.email = email;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
所以你得到一个实体,你把它转换成一个 VO 用于“层分离”(我也没有看到这一点,因为如果你改变一个实体你改变了 VO 然后你改变了使用该 VO 的表示层中的代码但是无所谓)
首先,VO 应该是不可变的,但在我为之工作的所有项目中,它们都是可变的。
我的问题是:这里有 getter/setter 有优势吗?
里面没有逻辑,有些人会告诉你 setter 可以做一些验证,但这没什么用,因为我们所有的代码都是经过单元测试的,所以不需要验证 setter 中的任何内容。
由于所有属性都有一个获取/设置,因此它们与公共属性完全相同。
当实现发生变化时,getter/setter 也会发生变化,所有使用旧 getter/setter 的代码都会被重构/修改。
我经常被告知数据隐藏,用户将无法访问私有财产:什么?用户正在浏览一个网站。
那么,为什么每个人都如此依赖那些 getter/setter 呢?如果我使用公共属性而不是那些 getter / setter 我会被嘲笑,每个人都会说“你不知道封装”,“你不应该有公共领域”
我的看法是它没用,但每个人都这样做,因为它一直是这样做的,没有人提出任何问题。
我错了吗?
谢谢。
解决方案
我错了吗?在您展示的示例中,我会说不,您没有错。这与对象与数据结构的区别有关,它似乎UserVo
是一种数据结构,因此使那些 getter 和 setter 完全无用。
对象将它们的数据隐藏在抽象之后,并公开操作该数据的函数(包括 getter 和 setter)。数据结构暴露了它们的数据并且没有有意义的功能。(清洁代码,罗伯特·马丁)
现在在 Java 中,一切都是一个实际的对象,并且该语言不支持数据结构。但这并不强迫我创建一个像数据结构一样工作的对象。
我的意思是为什么我会更喜欢这个
public class Point {
private double x;
private double y;
public double getX(){
return x;
}
public double getY(){
return y;
}
public void setX(double x){
this.x = x;
}
public void setY(double y){
this.y = y;
}
}
在这个?
public class Point {
public double x;
public double y;
}
推荐阅读
- javascript - Javascript 中令人困惑的 .constructor 属性
- python - protobuf 以八进制形式存储非英语字段值的数据
- c++ - std::promise set_exception 两次导致分段错误
- python - 如何从 dask Dataframe 中仅提取 50 行?
- laravel - Laravel 控制器方法如何处理多个表单请求参数?
- angular - 根据我的要求自定义角材质的分页器组件
- python - 在我开始使用 ipynb 之前,如何编写一个 shell 脚本来重新启动 jupyter 服务器
- spring-boot - 如何为单个项目中运行的每个批次创建单独的日志文件?
- php - php变量[1]在实际编码中的含义
- jmeter - 如何在两个线程组之间使用变量