程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2021-09-19 22:47     阅读(78)     评论(0)     点赞(12)     收藏(5)


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

为什么要使用 getter 和 setter/accessors?

当我能够使用 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 中的任何内容。

  • 由于所有属性都有一个 get/set,因此它们与公共属性完全相同。

  • 当实现更改时,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;
}


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/289998/359cddeb47c366197215/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)