我想知道我是否遗漏了一些关于Java Bean的东西.我喜欢我的对象在构造函数中尽可能多地进行初始化,并且具有最少数量的mutator.豆似乎直接反对这一点,并且通常感到笨重.我没有将我的对象构建为Beans而错过了哪些功能?
听起来你走在正确的轨道上.并不是你错过了Java Beans的观点,而是其他程序员滥用它们.
Java Beans规范旨在与可视化工具一起使用.我们的想法是,应用程序设计人员能够以交互方式配置对象的实例,然后对配置的bean进行序列化(或生成代码),以便可以在运行时重构它; 意图是它不会在运行时发生变异.
不幸的是,很多开发人员都不明白访问者是否违反了封装.他们使用结构而不是对象.他们没有看到其他类,甚至其他包有任何错误,依赖于类的数据成员.
当然,您通常需要配置对象的实例.只是应该通过某种配置功能来完成.这可能是依赖注入容器,"BeanBox"样式可视化工具,或者只是读取您手动编写的JSON,XML或属性文件.关键是在运行时这些对象实际上是不可变的; 客户只是调用他们的操作,他们不访问他们的属性.
我喜欢我的对象在构造函数中尽可能多地进行初始化,并且具有最少数量的mutator.
偏爱不可变对象是明智的选择.但是bean的好处是框架/工具/库可以在运行时确定类的属性,而不需要您实现特定的接口.
例如,假设您有一个Person bean的集合,并且每个bean都具有名称,年龄,身高等属性.
您可以使用以下代码按名称(例如)对此Bean集合进行排序:
CollectionmyCollection = // initialise and populate the collection Comparator nameCompare = new BeanComparator("name"); Collections.sort(myCollection, nameCompare);
该BeanComparator类知道如何提取从每个对象的"名称"属性,因为Java Bean约定之后,即你做足了实现接口如"开销":
interface Nameable { public String getName(); public void setName(String name); }
Spring MVC的另一个例子是存储请求URL参数的bean.这可以在Web控制器中定义(在Struts中称为"Action"),如下所示:
public ModelAndView searchUsers(UserSearchCriteria criteria) { // implementation omitted }
因为UserSearchCriteria应该是一个JavaBean,如果请求URL包含一个参数,例如maxItems=6
,Spring框架'知道'它应该调用带有签名的方法
void setMaxItems(int maxItems);
从本质上讲,JavaBeans只是一个简单的约定,允许在运行时(通常通过工具或框架)动态发现类的属性,当不方便/不可能事先知道可能提供的属性时.