我刚刚看到了Java Beans规范。我觉得只使用getter,setter和空构造函数会使代码更加繁忙,而开发人员需要管理跟踪以正确设置所有必需的实例。
有人能指出一个使用这种设计的好用例吗?我无法理解它。我可以想到一个用途 - "当你需要创建一个类的实例,以便稍后在代码中决定它的数据成员。"
编辑:伙计我不是在开始讨论。不想讨论优点/缺点。我不是在寻找像spring等当前的库,这使得它必须使用Beans。我正在寻找一个例子来了解Java bean带来的工程优势。 "只是Java Beans设计有用的一个例子"答案 0 :(得分:4)
许多库和规范(例如JPA,JavaEL)使用Java Beans规范并完全依赖于该行为。
使用getter和setter的优点是可以在这些方法中添加代码,例如创建“虚拟”属性,这些属性在运行时计算而不是存储在字段中。
此外,使用getter和setter允许其他框架包装这些方法并提供其他功能,如更改日志记录等。在许多情况下,这是通过内部创建子类并覆盖getter和setter来完成的。用户不会注意到,因为“编织”或“代理”通常在运行时完成。例如,当您调用getter访问相关集合或实体时,Hibernate使用它来提供延迟加载功能。
<强>更新强>:
根据请求,“虚拟”属性的示例:
假设您有一个Person
bean,其中包含firstName
和lastName
字段。您可以通过提供以下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)
the basic object oriented concept
- Encapsulation
想象一下,你为一个班级和另外十几个程序员编写了代码 来自贵公司所有人都写过使用你班级的程序。所以, 任何人都可以更改您的实例变量&amp;它可能会损害您的代码。
所以你应该
Keep instance variables protected
(access 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)
需要空构造函数来通过持久性框架的反射来创建新实例。如果您没有为该类提供任何其他构造函数,那么您不需要提供一个空构造函数,因为每个默认值都会得到一个。
根据我的经验,它可以防止有人添加带参数的构造函数,从而有效地删除默认构造函数。通过显式实现更不可能发生的默认构造函数。
另外,我猜你想象的是一个有很多属性的课程,这些课程很难只用吸气剂和二传手来填充,但也注意到这一点:
答案 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 会进行验证并开始抛出异常,这可能是明显错误的。因为,如果您更改方法的合同;你可能不想在隐蔽的情况下这样做。