首页 > 解决方案 > 当你不向任何人暴露任何东西时,你真的需要封装吗?

问题描述

请在推荐我发布此类帖子之前阅读,我在问一个非常具体的案例

为什么要使用 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 有优势吗?

那么,为什么每个人都如此依赖那些 getter/setter 呢?如果我使用公共属性而不是那些 getter / setter 我会被嘲笑,每个人都会说“你不知道封装”,“你不应该有公共领域”

我的看法是它没用,但每个人都这样做,因为它一直是这样做的,没有人提出任何问题。

我错了吗?

谢谢。

标签: javaarchitectureencapsulation

解决方案


我错了吗?在您展示的示例中,我会说不,您没有错。这与对象与数据结构的区别有关,它似乎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;
}

推荐阅读