java - 当您不向任何人公开任何内容时,您真的需要封装吗?

标签 java architecture encapsulation

请在推荐我发这样的帖子之前阅读,我问的是一个非常具体的案例:

Why use getters and setters/accessors?

What is the use of encapsulation when I'm able to change the property values with setter methods?

让我们以一个 JAVA JEE 应用程序为例,这些应用程序基本上都是网站。 您的银行网站可能是一个 JAVA JEE 应用程序。

在这些方面,我们通常是一个由 10-15 名开发人员组成的团队,除了我们之外没有人使用我们的代码,没有人导入我们的包并使用我们的对象。

后端通常有 DAO 来访问数据库和 Value 对象来将数据传输到表示层。

VO 是实体的完美副本,例如:

公共(public)类 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 应该是不可变的,但在我参与的所有项目中,它们都是可变的。

我的问题是:这里有 getters/setters 有优势吗?

  • 里面没有逻辑,有的会告诉你一个setter可以做 一些验证但这没有用,因为我们所有的代码都是 经过单元测试,因此无需验证 设置员。

  • 因为所有属性都有一个 get/set 是完全一样的 是公开的。

  • 当实现发生变化时,getter/setter 也会发生变化,并且 所有使用旧 getter/setter 的代码都被重构/修改。

  • 我经常被告知数据隐藏,用户将无法 访问私有(private)属性(property):什么?用户正在浏览网站。

那么,为什么每个人都如此依赖这些 getter/setter?如果我使用公共(public)属性而不是那些 getter/setter 我会被 mock ,每个人都说“你不知道封装”,“你永远不应该有公共(public)字段”

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

我错了吗?

谢谢。

最佳答案

我错了吗?在您展示的示例中,我会声明不,您没有错。这与对象与数据结构的区别有关,似乎 UserVo 是一种数据结构,因此使那些 getter 和 setter 完全无用。

Objects hide their data behind abstractions and expose functions that operate on that data (including getters and setters). Data structures expose their data and have no meaningful functions. (Clean Code, Robert Martin)

现在在 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;
}

关于java - 当您不向任何人公开任何内容时,您真的需要封装吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61635778/

相关文章:

architecture - AWS 可扩展架构设计

azure - 使用 Azure AD Auth 和 Web 应用程序 API 进行 Multi-Tenancy

python - Django - 如何可视化信号并保存覆盖?

javascript - 将我的变量放在命名空间下

c# - 访问dll方法

java - String.equals() 总是返回真

java - "Error: Could not find or load main class"启动Hadoop时

java - 如何在 Javafx 中动态添加新标签

typescript - Typescript 中是否需要访问器?

java - 每个 API 的 Firestore 导入/导出