【问题标题】:Java beans, annotations: What do they do? How do they help me?Java bean、注解:它们是做什么的?他们如何帮助我?
【发布时间】:2010-01-15 15:29:59
【问题描述】:

这是我目前所理解的:

Java bean 只是为了帮助其他事物(视觉事物?)与您的代码交互。我认为这主要用于 UI 的东西,因为它更容易在视觉上设计。将 Java bean 用于非 UI 的东西是不好的做法吗?

Java bean 具有 getter 和 setter 方法(糟糕的 OOP 实践)并且是可序列化的。

在注解方面,我认为用户定义的注解不提供任何功能。 @depretiated 等一些注解会引发编译器警告。用户定义的注释可以以某种方式做到这一点吗?用户定义的注释是否适用于文档以外的任何内容?我该如何使用它们? eclipse 或 intellij 是否有一些涉及注释的功能?

周末愉快。

杰克

更新: 开始变得更有意义了。有人可以给我举个例子,说明什么时候适合使用 java bean 格式,什么时候不适合?

另外,我在某处读到几个类可以是一个 bean,它是一种打包类的方式。

只是为了澄清一件事。我 95% 确信成为一个 java bean 有点像成为一个单例(或其他模式)。它不会影响编译器的功能。

【问题讨论】:

  • getter/setter 方法的 OOP 实践如何?这是没有意义的。你不是说它们太冗长/样板代码生成了吗?然后只需使用一个体面的 IDE,它只需单击几下即可为您自动生成所有这些内容,只需输入属性名称即可。
  • 有些人认为 getter/setter 的某些用途违反了封装原则......即“不要询问您完成工作所需的信息;询问有信息的对象来完成为你工作。”来自javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html?page=3
  • @James:是的,它在 DDD 中更常见。

标签: java design-patterns annotations javabeans


【解决方案1】:

注解是declaritive programming 的一种形式。首先,在注释的实用性变得清晰之前,您必须了解声明式编程的好处。本质上,您可以简单地通过“声明”它具有某种特征来向代码块添加功能或行为。这与实际编写一系列语句来应用或设置相同的行为形成对比。

JPA annotations 是使用注释添加功能的示例。我不知道“用户创建”的例子,但 JPA 注释的实现方式与您或我的实现方式完全相同。

就 Java Bean 而言,它们最初的用途是用于 GUI 编程。使用 JavaBeans 的“简单”方式是使用命名约定来定义 bean 的“属性”——因此是 getter 和 setter。据我所知,JavaBeans 最初是一种基于 GUI 编辑表单和 UI 的实现。因此,getter 和 setter 使 UI 软件很容易发现用户可查看或可编辑的属性。使用 Bean 描述符,您可以稍微改变描述符的工作方式...

他们坚持到今天的原因是他们提供了一种事实上的方式来检查对象的公开暴露属性。在 GUI 之外使用 JavaBeans 也不错。 Java 中的偏好似乎是使用无 arg 构造函数,然后注入您的依赖项,而不是使用 RAII 编程风格(并不是说它是严格可用的)...

这实际上很常见,特别是如果对象将由不先验地知道它将要操作的对象的代码操作(请查看Hibernate 的一个很好的例子)。

【讨论】:

  • 太棒了,开始掌握 Java bean。但是对于注释的作用仍然有点不稳定。注释会影响编译的代码吗?或者它们只是给程序员的指令。它们是否以与接口类似的方式工作(并迫使程序员出现编译器错误)来实现某些方法/遵循某些标准?为此提出一个新问题会更好吗?周一快乐!
  • 以上所有。我建议打开一个专门讨论注释的新 Q。
【解决方案2】:

我怀疑您混淆了 Java bean 和 EJB(企业 Java Bean)——它们是不同的概念。实际上它们现在几乎相同,但并非总是如此 - 历史相当混乱。

James 很好地解释了 Java bean 的历史——它们比注解(在 Java 1.5 中引入)更古老。 EJB 也更古老,但经过彻底修改,现在基本上是带有特殊注释的 Java bean,在 EJB 容器中运行。

这实际上是一个很好的例子,说明了注释的有用性。

“旧式”EJB(在规范的第 3 版之前)对代码来说是可怕的。您需要定义(IIRC)两个接口,一个实现类(实际上并未实现接口)和一个将它们链接在一起的 XML 描述符。如果您在任何地方打错字,则不会出现编译器错误 - 只是一个完全神秘的运行时错误,无法帮助您缩小问题范围。

为什么会这样?因为它允许 EJB 容器控制实际实现代码的调用方式,并透明地执行访问控制、事务和复制等操作。

在 EJB 3.0 规范中,这被彻底简化,因此现在您只需要一个类(在实体 bean 的情况下可以是“经典”Java Bean),它实际上实现了 EJB 的逻辑 - 和注释告诉 EJB 容器如何处理它。与单独的 XML 文件不同的是,有关代码的信息位于同一文件中的代码本身旁边,并且由于编译器会检查注释语法,因此在编译时会发现许多潜在的错误。

【讨论】:

  • 好的,所以我想你说的是有两种豆子。在 EJB 中,注释由编译器处理,否则它们不是吗?这是否意味着要编译 EJB 需要一个特殊的编译器?感谢您的帮助。
  • 否,EJB 注释由 EJB 容器在运行时处理。但它们仍然是代码的一部分,并由编译器检查语法错误(然后将它们放入类文件中,可以通过反射访问它们)。旧式 EJB 的元数据在 XML 描述符中,Java 编译器显然不知道,因此无法检查。
  • 注解可以用来影响编译器,例如@Override - 但这实际上是一个比在运行时使用的注解更不重要的用例(因为很少有人编写编译器)。
  • 我对@Override 的理解只是它通知程序员一个方法被覆盖(如果程序员使用不正确,它会发出警告/错误)。没想到改变了代码的功能。。你是这个意思吗?
  • 没关系。对于其他想了解注释的人,请看这里:这是一个很棒的解释:java.sun.com/docs/books/tutorial/java/javaOO/annotations.html
【解决方案3】:

JUnit 从 JUnit 版本 4 开始使用注解。这是用户定义注释的示例。您将 @Test-annotation 添加到方法中,JUnit 框架会识别它并将该方法作为测试执行。

某些框架将使用 Bean 来处理其他未知对象。我想到的一个例子是持久性框架,它们将一些注册的对象复制到数据库中,并为此使用 bean-properties。

【讨论】:

  • 嗯,好吧,这很有趣。我使用的是版本 3,所以我不知道。 JUNIT如何检测到有注解?我也能检测到吗? (不知道为什么我想检测到,但是..)谢谢,享受你的星期一
  • for (Method m : Class.forName(args[0]).getMethods()) { if (m.isAnnotationPresent(Test.class)) { ... } } 看起来该代码可以做到。
  • 没错,Java-reflection-API 还允许您查找注释。这是在一定程度上扩展语言的可能性:您可以添加自己的注释。
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多