Java Bean的一个很好的用例是什么?

时间:2015-05-18 13:42:49

标签: java javabeans

我刚刚看到了Java Beans规范。我觉得只使用getter,setter和空构造函数会使代码更加繁忙,而开发人员需要管理跟踪以正确设置所有必需的实例。

有人能指出一个使用这种设计的好用例吗?我无法理解它。我可以想到一个用途 - "当你需要创建一个类的实例,以便稍后在代码中决定它的数据成员。"

编辑:伙计我不是在开始讨论。不想讨论优点/缺点。我不是在寻找像spring等当前的库,这使得它必须使用Beans。我正在寻找一个例子来了解Java bean带来的工程优势。 "只是Java Beans设计有用的一个例子"

6 个答案:

答案 0 :(得分:4)

许多库和规范(例如JPA,JavaEL)使用Java Beans规范并完全依赖于该行为。

使用getter和setter的优点是可以在这些方法中添加代码,例如创建“虚拟”属性,这些属性在运行时计算而不是存储在字段中。

此外,使用getter和setter允许其他框架包装这些方法并提供其他功能,如更改日志记录等。在许多情况下,这是通过内部创建子类并覆盖getter和setter来完成的。用户不会注意到,因为“编织”或“代理”通常在运行时完成。例如,当您调用getter访问相关集合或实体时,Hibernate使用它来提供延迟加载功能。

<强>更新

根据请求,“虚拟”属性的示例:

假设您有一个Person bean,其中包含firstNamelastName字段。您可以通过提供以下getter来添加只读虚拟属性name

public String getName() {
  return getFirstName() + " " + getLastName();
}

更新2:

关于为什么需要getter和setter的另一个注释:这主要来自Java的工作原理。直接支持属性的语言(如C#)将允许您编写类似person.firstName = "Joe";的代码,如果存在,则仍然使用setter,如果属性是只读的,则抛出错误。因此,如果您为firstName添加了一个setter,那么这些语言会在内部将firstName = "Joe"翻译为setFirstName("Joe"),而开发人员无需进行任何更改 - 这是一个非常优雅的解决方案。 :)

由于Java不支持,我们必须始终提供访问器方法(setter / getters),即使它们没有做任何特殊操作 - 以防它们可能需要更改未来。

答案 1 :(得分:1)

吸气者&amp; setters确保 the basic object oriented concept - Encapsulation

  

想象一下,你为一个班级和另外十几个程序员编写了代码   来自贵公司所有人都写过使用你班级的程序。所以,   任何人都可以更改您的实例变量&amp;它可能会损害您的代码。

所以你应该

Keep instance variables protectedaccess modifier, often private)。

制作public accessor methods,并强制调用代码以使用这些方法 的 rather than directly accessing the instance variable 即可。

他们的代码在代码中出现错误。

查看以下示例

public class MyClass{
public int size;
public int weight;
...
}
public class OthersClass {
public static void main (String [] args) {
MyClass myClass= new MyClass();
myClass.size = -5; // Legal but bad logic
}
}

答案 2 :(得分:1)

需要空构造函数来通过持久性框架的反射来创建新实例。如果您没有为该类提供任何其他构造函数,那么您不需要提供一个空构造函数,因为每个默认值都会得到一个。

根据我的经验,它可以防止有人添加带参数的构造函数,从而有效地删除默认构造函数。通过显式实现更不可能发生的默认构造函数。

另外,我猜你想象的是一个有很多属性的课程,这些课程很难只用吸气剂和二传手来填充,但也注意到这一点:

  • Getters将自动化视图部分。
  • Setters将允许您在必要时添加验证或错误控制。

答案 3 :(得分:1)

除了JavaBeans规范的实际优点和缺点之外,我认为重要的是要记住它是1996年引入的一个规范,用于实现Java代码的可视化编辑。

我不知道这种编程方法是否成功并已被采用(我个人从未使用过它)。我所知道的是,规范继续存在并且应用得非常广泛(恕我直言,有时候也适用于不适合的情况)。

我认为可以使用JavaBeans最有用的地方是框架。一个很好的例子是Spring。 只要类实例化不负责程序员,JavaBean类就非常适合,但是被委托给应用程序容器(例如通过反射)。

答案 4 :(得分:0)

如上所述,JavaBeans可以用作DAO(数据访问对象),用于检索数据并将数据保存到(主要是SQL)数据库。它们非常有用,你真正关心的只是数据

答案 5 :(得分:0)

许多人会告诉你,Java Bean比使用纯粹的Java对象要好得多,这些对象充当&#34;数据传输对象&#34;。

但是其他人,例如这个人在他着名的书中 https://cleansourcecode.files.wordpress.com/2013/10/clean-code.pdf表明,大多数情况下,&#34; bean&#34;并且getter和setter确实有没有多少额外的值(整个第6章专门讨论这个问题)。

所以你应该自己决定(可能和你的队友一起),如果你的问题可以通过&#34; Java Beans&#34;更好地解决。或&#34;普通数据传输对象&#34;。

当然,&#34;豆类&#34;强制您使用setter,这允许您稍后添加验证。另一方面:这样的更改会修改方法的语义;突然之间 setter 会进行验证并开始抛出异常,这可能是明显错误的。因为,如果您更改方法的合同;你可能不想在隐蔽的情况下这样做。