Java Bean 作为数据存储类是糟糕的设计吗?

2024-02-18

通常 JavaPractices.com 是一个有好想法的好网站,但这个网站让我很困扰:JavaBean 很糟糕 http://www.javapractices.com/topic/TopicAction.do;jsessionid=0F0A24B7C139B1C197FD08C0240DB8EC?Id=84.

文章引用了几个原因,主要是术语 JavaBean 的意思是“Java Bean 是一个可重用的软件组件,可以在构建器工具中进行可视化操作”。不是数据存储,违反某些模式,并且更复杂。

现在我可以同意最后一个观点,但在我看来,列表中的 JavaBean 比嵌套的 Map 更有意义。该文章声称数据库映射框架应该调用构造函数,而不是 set* 方法,并且对象应该是不可变的。然而,在我看来,在尝试构建对象时调用 set* 方法比调用 set* 方法更容易阅读new MappedObject("column1", "column2", "yet another column", "this is stupid");

除了数据库映射之外,我还将 JavaBean 样式类用于其他用途,例如,对于 IRC 机器人,每个用户都有一个可以使用各种内容进行更新的对象。我不想每次给出新信息时都创建一个新对象,我想将其添加到现有对象中。

所以我的问题是:使用 JavaBeans 进行数据存储是一种不好的做法并且应该避免,还是完全安全?


看来你误读了文字。

现在我可以同意最后一个,但在我看来,列表中的 JavaBean 比嵌套 Map 更有意义

文本从未提及嵌套映射作为替代方案(yiack)

...应该调用构造函数,而不是 set* 方法,并且对象应该是不可变的

这是一个很好的做法,在处理线程时特别有用。

但我们不能说使用 setter 是baaad要么,特别是当单个线程正在使用该对象时。这是绝对安全的。

我不想每次给出新信息时都创建一个新对象,我想将其添加到现有对象中。

没关系,只要您控制该对象就没有问题,其他人可能会发现创建新对象更容易。

使用 JavaBean 进行数据存储是一种不好的做法并且应该避免,还是完全安全?

不,这不是一个坏习惯。不是万无一失任何一个。视情况而定。

可变对象(不是 JavaBean 本身)的问题是使用不同的线程来访问它们。

您必须同步访问以避免一个线程在其他线程访问该对象时修改该对象。

不可变对象没有这个问题,因为,..它们不能改变,因此,你不必同步任何东西。

为了确保对象不可变,您必须将属性声明为最终属性。

class MyBean  {
    private final int i;
}

如果你想分配一个合理的值MyBean.i你必须在构造函数中指定它:

 public MyBean( int i ) {
     this.i = i;
 }

由于变量是最终变量,因此不能使用 setter。你可以只提供一个吸气剂。

这是完全线程安全的,最好的是,您不必同步访问,因为如果两个线程尝试获取i它们都将始终看到实例化时分配的值,您不必同步任何内容。

不是不好的做法,也不是好的做法。即使在像 servlet 这样的多线程环境中,我们也必须使用单线程。

如果将来您必须处理多线程应用程序,您可以考虑使用不可变的 JavaBean ;)

顺便说一句,创建不可变 bean 并仍然提供一堆设置器的替代方法是使用Builders like:

 Employee e = new EmployeeBuilder()
                  .setName("Oscar")
                  .setLastName("Reyes")
                  .setAge(0x1F)
                  .setEmployeeId("123forme")
                  .build(); 

它看起来与常规 bean 中使用的常规 setXyz 非常相似,优点是使用不可变数据。

如果需要更改一个值,可以使用类方法:

 Employee e = Employee.withName( e, "Mr. Oscar");

它获取现有对象,复制所有值,然后设置一个新对象......

 public static EmployeeWithName( Employee e , String newName ){
      return new Employee( newName, e.lastName, e.age, e.employeeId );
  }

但同样,在单线程模型中使用 getter/setter 是完全安全的。

PS我强烈建议你购买这本书:有效的Java http://java.sun.com/docs/books/effective/。你永远不会后悔,而且你将有信息来判断更好的文章,比如引用的一篇文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Bean 作为数据存储类是糟糕的设计吗? 的相关文章

随机推荐

  • WPF 文本块,文本属性中的换行符

    有没有办法拥有 n在 a 中换行TextBlock
  • 如何创建文件并从 html 页面附加数据?

    我的桌面上有一个 html 文件 需要一些输入 我将如何将该输入写入计算机上的文件中 我是否必须使用另一种语言来执行此操作 即 python 或 javascript 以及我将如何执行此操作 相关说明 有什么方法可以让 javascript
  • wordpress is_home() || is_index() 可能吗?

    我在 header php 中有一个测试 看看我们是否在家显示英雄 div class inner clearfix div 但是当用户登陆index php时 英雄并没有被显示 显然没有 is index 条件 有谁知道我如何测试它的主页
  • 如何使用 Json.Net (newtonsoft) 连接两个 Json 对象[重复]

    这个问题在这里已经有答案了 我想将一些 JSON 对象连接成一个 JSON 对象 如何使用 NewtonSoft 的 JSON 包来做到这一点 Use JContainer Merge 将 JSON 对象组合在一起的逻辑相当简单 名称 值被
  • 在哪里可以找到 Perl 编程语言的形式语法?

    我知道 Perl 语法是不明确的 并且它的消歧是不平凡的 有时涉及在编译阶段执行代码 http www modernperlbooks com mt 2009 08 on parsing perl 5 html 无论如何 Perl 是否有正
  • Firestore 安全规则 - 查询集合时检查文档字段

    当查询文档集合并使用安全规则检查文档上的字段以允许读取时 我得到 Uncaught Error in onSnapshot Error Missing or insufficient permissions 我的查询 firebase fi
  • 使用反射获取 Kotlin 中带注释的函数列表

    我是 Kotlin 新手 我想做以下事情 用注释来注释一些函数 例如 可执行文件 运行时 获取带有该注解的所有函数 检查注释上的属性 如果它与条件匹配 则调用该函数 我有以下代码 annotation class Executable va
  • 使用模板时初始化数组

    假设我有课Foo 以下工作正常 class Foo public const int bar Foo bar new int 2 1 2 但是 我尝试稍微更改一下以使用模板 template
  • 在 Gulp 任务中获取相对源/目标

    假设我有一个文件 Users me app src scripts foo js 我设置了一个 gulp 任务 将该文件写入 Users me app dist scripts foo js gulp src src scripts foo
  • 将 google 字体 (fonts.googleapis.com) 添加到 CSP 标头

    我在 gitHub 页面上托管一个个人项目 并使用 cloudflare 强制执行 https 现在我想实施 CSP 政策 我尝试将元标记添加到页面的头部 但我收到以下错误 拒绝加载样式表 https fonts googleapis co
  • VB 按住按键

    我正在创建一个宏程序来记录和回放鼠标和键盘输入 录音效果很好 鼠标播放也很好 但我在播放键盘输入时遇到了麻烦 特别是在释放之前按住某个键几秒钟 这并不等同于重复按键 这是我尝试过的 技术 1 Me KeyDown Private Sub k
  • 从 ASP 脚本使用 dll 的最佳方法

    我正在编写一些 ASP 代码来服务来自公司 Intranet 上的简单 HTML 表单的请求 该代码需要从 COM dll 调用方法 我正在使用代码 myObject Server CreateObject myDLL myClass 但它
  • 简单语法:Alter Table 语句中的多个约束

    如果我有这样的声明 ALTER TABLE RecipeBox Recipe ADD CONSTRAINT AKRecipeBox Recipe Name UNIQUE NONCLUSTERED Name 如何向此语句添加另一个约束 这可能
  • 如何真正删除 VSTS / Azure-devops 上的提交

    我正在开发 VS 2017 我们有云 VSTS Azure devops 我最近提交并推送了 并意识到 8 个文件不应该在其中 之后我再次提交了一份干净的文件并推入远程 现在我可以在 VSTS 网站 portail 中看到这两个提交 问题是
  • 如何使用自定义 python 类型参数发出 PySide 信号?

    我在 PySide python Qt 程序中正确使用信号时遇到问题 我想发出一个信号 该信号采用自定义 python 类型的单个参数 这文档 http www pyside org docs pyside git newsigslot h
  • 删除行时平滑重新加载 uitableview 数据

    我试图在 uitableview 滚动到屏幕底部时重新加载它 我删除前几行并在底部添加更多行 Before新闻行被添加到 uitableview 的数据源中 我称之为 tableview reloaddata 方法 这是因为我希望表视图显示
  • 访问被拒绝:hyperledger Fabric Channel.initialize()

    我正在使用 java sdk 并在初始化通道时遇到错误 Channel mychannel fabClient getInstance newChannel Config CHANNEL NAME Orderer orderer fabCl
  • 在 C++ 中将字符串转换为短字符串

    因此 我四处寻找如何将字符串转换为短整型 并发现了很多有关如何将字符串转换为整数的信息 我会留下一个问题作为对这些线程的评论 但我没有足够的声誉 所以 我想做的是将字符串转换为短字符串 因为数字永远不应该超过三或低于零 并且短字符串可以节省
  • Angular/JavaScript 中 result.id 和 result['id'] 之间的区别?

    我想知道 Angular JavaScript 中的 result id 和 result id 有什么区别 如果我输入 getId this service getId subscribe result gt var i result i
  • Java Bean 作为数据存储类是糟糕的设计吗?

    通常 JavaPractices com 是一个有好想法的好网站 但这个网站让我很困扰 JavaBean 很糟糕 http www javapractices com topic TopicAction do jsessionid 0F0A